何時使用遞迴

2021-06-22 11:52:25 字數 2264 閱讀 8283

遞迴**於數學中的歸納法,歸納法是數學裡的一種證明方法,它通常有以下兩個步驟:

證明當 n 等於某乙個值(通常是限定範圍內的第乙個值)時命題成立;

假設當 n = m 時命題成立,證明當 n = m + 1 時命題也成立。

數學中的歸納法由已知推向未知由前推向後,而在程式設計中通常是給定 n 的值(如 n = m)求結果,這與數學中的歸納法在過程上有些不同,多了乙個回推的過程,通常是先由後向前,再由前向後(並不都是這樣)。假定 n >= 1,並且 n = 1 時的結果已知,步驟如下:

要想求得 n = m 時的結果,必須知道 n = m - 1 時的結果,要想知道 n = m - 1 時的結果,必須知道 n = m - 2 時的結果,如此反覆直到 n = 1(此時結果已知),此過程即由後向前;

已知 n = 1 的結果就可得到 n = 2 時的結果,得到 n = 2 時的結果就可得到 n = 3 時的結果,如此反覆直到得出 n = m 的結果,此過程即由前向後。

1.利用遞迴求階乘

階乘比較符合遞迴演算法過程也比較好理解,所以我們先用遞迴來舉例:

public class main 

// 求 m 的階乘

private static int factorial(int m)

return m * factorial(m - 1); // 呼叫自己,m 時的結果依賴於(m-1)時的結果

}}

2.利用遞迴求斐波那契(fibonacci)數列

斐波那契數列指的是1、1、2、3、5、8……這樣的數列,用公式表示就是:

f(n) = f(n-1) + f(n-2)

**如下:

public class main 

// 求斐波那契數列第 n 個數的值

private static int fibonacci(int n)

return fibonacci(n - 1) + fibonacci(n - 2); // 第n項為第(n-1)項與第(n-2)項之和

}}

以上兩例僅作遞迴演示,實際上並不適合使用遞迴,因為其需要回推使得效率大大降低,對於這種明顯可以使用迴圈解決而遞迴又需要回推導致效率低下的情況更適合使用迴圈:

1. 使用迴圈求階乘

public class main

// 求 m 的階乘

private static int factorial(int m)

return product;

}2.使用迴圈求斐波那契數列

public class main

// 求斐波那契數列第 n 個數的值

private static int fibonacci(int n)

return b;

}}

1.快速排序
public static void quicksort(int arr, int left, int right)

if (j > i)

// 從前向後查詢

while (i < j && arr[i] < mark)

if (i < j)

}arr[i] = mark;

quicksort(arr, left, i - 1);

quicksort(arr, i + 1, right);

}}

2.漢諾塔(hanoi)

漢諾塔是乙個經典的演算法題,常被用作遞迴演算法案例,詳細描述可見鏈結。**如下:

public class main 

// 將 num 個盤從 a 塔移到 c 塔

private static void hanoi(int num, char a, char b, char c)

else

}// 從 x 移到 y 上面

private static void move(char x, char y)

}

作乙個簡單的總結,對於階乘和斐波那契數列這樣的問題實際上並不適合使用遞迴,首先它需要回推會導致計算量大大增加,其次這種問題使用迴圈本身很容易解決,而且**也並不複雜。而對於快速排序這種「分而治之」的情況,並不存在回推的過程使用遞迴可以簡化**增強**的可讀性,對於漢諾塔使用遞規不僅大大簡化了**也更易理解。總而言之,不管使用什麼方法,其目的無非就是提高程式執行效率,減化**增強**的可讀性。

NoSQL與RDBMS 何時使用,何時不使用

naresh kumar是位軟體工程師與熱情的博主,對於程式設計與新事物擁有極大的興趣,非常樂於與其他開發者和程式設計師分享技術上的研究成果。近日,naresh撰文比較了nosql與rdbms,並詳細介紹了他們各自的特點與適用的場景。nosql並不是關係型資料庫管理系統,本文將會介紹nosql資料庫...

何時使用或何時不使用malloc函式

在初學資料結構時,我們往往不太清楚在定義乙個結構體指標時要不要使用malloc函式。例如以下的 linklist init linklist retrun h linklist s s data x 以上這兩句 是不行的,因為s沒有指向確切的位址,所以不能通過s來向它要指向的位址賦值 但是linkl...

MySQL何時使用索引 何時不使用索引

mysql何時使用索引 對乙個鍵碼使用 if null和between select from table name where key part1 1 and key part2 5 select from table name where key part1 is null 當使用不以萬用字元開...