周末溫習了一下遞歸相關的一些概念,本文先給出階乘的五種算法。
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 }
這里比較有意思的實現是:尾遞歸和基于堆中的棧的遞歸,本文先不詳細介紹了,后面再細說,有興趣的朋友先看如下資源:
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.首先...