當實體呼叫自身
時,程式稱為遞迴
。
當存在循環(或重複)
時,程式稱為迭代呼叫
。
範例:求一個數的階乘的程式
# 時間複雜度比較
找出遞歸的時間複雜度比迭代更難。
遞歸
:遞歸的時間複雜度可以透過根據先前的呼叫找到第 n 次遞歸呼叫的值來找到。因此,根據基本情況找到目標情況,並根據基本情況求解,可以讓我們了解遞歸方程式的時間複雜度。
迭代
:迭代的時間複雜度可以透過找到循環內重複的循環數來找到。
用法比較
# 使用這些技巧中的任何一種都是時間複雜度和程式碼大小之間的權衡。
如果時間複雜度是重點,遞歸呼叫的次數會很大,那麼最好使用迭代。
但是,如果時間複雜度不是問題而程式碼的短小是問題,那麼遞迴將是可行的方法。
遞歸:遞歸涉及再次呼叫相同的函數,因此程式碼長度非常短。然而,正如我們在分析中看到的那樣,當遞歸呼叫數量相當多時,遞歸的時間複雜度可能會呈指數級增長。因此,遞歸的使用在更短的程式碼中是有利的,但時間複雜度更高。
迭代:迭代是程式碼區塊的重複。這涉及較大的程式碼量,但時間複雜度通常低於遞歸。
開銷
#與迭代相比,遞迴有大量的開銷。
遞歸
:遞歸有函數重複呼叫的開銷,即由於重複呼叫同一個函數
,程式碼的時間複雜度增加了很多倍
。
迭代
:迭代不涉及任何此類開銷。
無限重複
# 遞迴
中的Infinite Repetition 會導致CPU crash,但在迭代中,當記憶體耗盡時它會停止。
遞歸
:在Recursion中,由於指定的基本條件錯誤,可能會出現無限遞歸調用,在永遠不會為假的情況下,不斷調用函數,這可能會導致系統CPU崩潰。
迭代
:由於迭代器賦值或遞增錯誤或終止條件錯誤而導致的無限迭代將導致無限循環,這可能會或可能不會導致系統錯誤,但肯定會停止程式的進一步執行。
遞迴 | ||
---|---|---|
定義 | 函數呼叫自身。 | 重複執行的一組指令。 |
應用程式 | 對於功能。 | 對於迴圈。 |
終止 | 透過 base case,這裡不會有函數呼叫。 | 當不再滿足迭代器的終止條件時。 |
用法 | 當程式碼大小需要很小且時間複雜度不是問題時使用。 | 當時間複雜度需要與擴充功能的程式碼大小平衡時使用 |
#程式碼大小 | 更少的程式碼 | |
#更多的代碼 | ||
時間複雜度 | 非常高(通常是指數)的時間複雜度。 | 時間複雜度相對較低(一般為多項式-對數)。 |
空間複雜度 | 空間複雜度高於迭代。 | 空間複雜度較低。 |
堆疊 | 這裡的堆疊是用來存放函數呼叫時的局部變數的。 | 不使用堆疊。 |
速度 | 執行速度很慢,因為它有維護和更新堆疊的開銷。 | 通常,它比遞歸更快,因為它不使用堆疊。 |
儲存 | 與迭代相比,遞歸使用更多記憶體。 | 沒有開銷,因為迭代中沒有函數呼叫。 |
public class Test { // ----- 递归 ----- // 求给定数的阶乘的方法 static int factorialUsingRecursion(int n) { if (n == 0) return 1; // 递归呼叫 return n * factorialUsingRecursion(n - 1); } // -----迭代 ----- //求给定数的阶乘的方法 static int factorialUsingIteration(int n) { int res = 1, i; // 迭代 for (i = 2; i <= n; i++) res *= i; return res; } public static void main(String[] args) { int num = 5; System.out.println("Factorial of " + num + " using Recursion is: " + factorialUsingRecursion(5)); System.out.println("Factorial of " + num + " using Iteration is: " + factorialUsingIteration(5)); } }
Factorial of 5 using Recursion is: 120 Factorial of 5 using Iteration is: 120
以上是Java遞歸和迭代差異是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!