1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          算法

          來源:互聯網轉載 時間:2024-01-29 07:57:26

          背景

          周末溫習了一下遞歸相關的一些概念,本文先給出階乘的五種算法。

          第一種實現:遞歸

           1         private static long RecursiveFac(long n) 2         { 3             if (n == 0) 4             { 5                 return 1; 6             } 7             else 8             { 9                 return n * RecursiveFac(n - 1);10             }11         }

          第二種實現:遞推

           1         private static long Fac(long n) 2         { 3             var result = 1; 4  5             for (var i = 1; i <= n; i++) 6             { 7                 result = result * i; 8             } 9 10             return result;11         }

          第三種實現:尾遞歸

          1         private static int TailRecursiveFac(int n, int accumulator)2         {3             if (n == 0)4             {5                 return accumulator;6             }7 8             return Fac(n - 1, n * accumulator);9         }

          第四種實現:消除尾遞歸

           1         private static int Fac(int n, int accumulator) 2         { 3             while (true) 4             { 5                 var tempN = n; 6                 var tempAccumulator = accumulator; 7  8                 if (tempN == 0) 9                 {10                     return tempAccumulator;11                 }12 13                 n = tempN - 1;14                 accumulator = tempN * tempAccumulator;15             }16         }

          第五種實現:堆棧(堆中分配的棧)替換函數棧

           1         private enum CodeAddress 2         { 3             Start, 4             AfterFirstRecursiveCall 5         } 6  7         private class StackFrame 8         { 9             public long N { get; set; }10 11             public long FirstRecursiveCallResult { get; set; }12 13             public CodeAddress CodeAddress { get; set; }14         }15 16         private static long StackFac(long n)17         {18             var stack = new Stack<StackFrame>();19             stack.Push(new StackFrame20             {21                 N = n,22                 CodeAddress = CodeAddress.Start23             });24 25             long result = 0;26 27             while (stack.Count > 0)28             {29                 var current = stack.Peek();30 31                 switch (current.CodeAddress)32                 {33                     case CodeAddress.Start:34                         if (current.N == 0)35                         {36                             result = 1;37                             stack.Pop();38                         }39                         else40                         {41                             current.CodeAddress = CodeAddress.AfterFirstRecursiveCall;42                             stack.Push(new StackFrame43                             {44                                 N = current.N - 1,45                                 CodeAddress = CodeAddress.Start46                             });47                         }48                         break;49                     case CodeAddress.AfterFirstRecursiveCall:50                         current.FirstRecursiveCallResult = result;51 52                         result = current.N * current.FirstRecursiveCallResult;53                         stack.Pop();54                         break;55                 }56             }57 58             return result;59         }

          備注

          這里比較有意思的實現是:尾遞歸和基于堆中的棧的遞歸,本文先不詳細介紹了,后面再細說,有興趣的朋友先看如下資源:

          • Replacing Recursion With a Stack。
          • How to replace recursive functions using stack and while-loop to avoid the stack-overflow。
          • HOW TO CONVERT A RECURSIVE ALGORITHM TO A NON-RECURSIVE ONE。
          • replace Recursion with Iteration。
          • Provide an explanation of recursion, including an example。
          • Tail Recursion。
          • Understanding Tail Recursion。

          155051.html

          標簽:階乘算法-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          用impdp導入數據時報錯是怎么回事?導出的文件有錯,ORA-39183:出現內部錯誤-16(在解壓縮階段2)可以發現。另外ORA600KLAPRS_11一般也是由于導出文件錯誤引起的。重新導出一份,用2進制格式發送即可。 oracle數據庫用impdp導入的問題?DMP文件導入: 1.用SYS用戶名,以DBA的身份登入到數據庫(ORACLE客戶端EnterpriseManagerConsole...

          星號密碼顯示器?當我們輸入密碼時,它正在竊取代碼,特別是在互聯網上,它會自動變為星號,對嗎?星號密碼查看器是用來查看這些內容的。我告訴你如何使用XP的XP星號密碼查看器。單擊“開始檢測”后,我將指針指向adept。如果密碼框將顯示星號所代表的,我看不到空白等待密碼。此外,“網絡連接”對話框中的“請單擊此處更改密碼”不起作用。要查看密碼,需要ADSL密碼查看器。C語言加密碼變成星號?#包括和限制。H...

          為什么PS打開的文件取消不了鎖定?要解鎖ps中的所有圖片,只需點擊圖片左側的圖層鎖定按鈕,點擊解鎖界面即可。PSl鏈接圖層已經鎖定怎么辦?雙擊圖層面板中鎖定的圖層,選擇【確定】解鎖;點擊圖層右側的小鎖圖標解鎖;【索引】圖層,然后選擇【圖像】-【模式】-【RGB顏色】解鎖;當圖層上方的鎖按鈕被鎖定后,點擊圖層右側的小鎖圖標可以全部解鎖,點擊上方的鎖圖標可以解鎖相應的鎖。ps圖層怎么使用鎖定?1.首先...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>