遞歸學習(筆記)

定義:將一個大的問題分解成比較小的,有着相同形式的問題。


條件:(1)必須能夠鑑別出一個簡單情景,並且該情景的答案的容易確定的。

            (2)必須能夠確認一個遞歸的分解方式,能夠將問題的複雜實例分解爲更小的,具有相同形式的問題。


當計算機完成對遞歸函數的一次調用時,它執行的是和調用其他函數同樣的過程。

在理解遞歸程序時,必須能夠拋開底層的細節,將注意力集中在單個計算層次上。

在這個層次上,只要一個遞歸調用的參數在某些方面能比前一個參數更簡單,那麼就可以認爲遞歸調用都能夠自動的得到正確的答案。

遞歸的實質是將問題分解爲更簡單的問題,而這些問題能夠通過調用完全相同的函數來解決。


#include<stdio.h>


//首先理解該函數的作用是爲計算第n個斐波拉契數
int fib(int n)
{
// 能夠很容易確定的一個簡單情景,並且答案已知
    if (n == 1 || n == 2)
        return 1;

//返回第(n-1)個斐波拉契數與第(n-2)個斐波拉契數的和,就是第n個斐波拉契數
    return fib(n-1) + fib(n-2);
}

int main()
{
    int n;
    scanf("%d", &n);
    printf("%d\n", fib(n));
}
當在調用fib(n-1)和fib(n-1)時,不用關心怎麼能計算出來,因爲fib函數的作用就是計算第n個或是第n-1個,第n-2個。。。第1個等的斐波拉契數,就當做一個普通函數進行調用。

在每一層的調用中,n的值都會不斷減小,這樣求第n個斐波拉契數就逐漸變成求第n-1個和第n-2個斐波拉契數,再轉換爲求第n-2個和第n-3個斐波拉契數。。。一直這樣下去,直到求第一個和第二個數,便層層返回,最終求得第n個斐波拉契數,得到解。這過程中,就將原問題,劃分爲與原問題相同的規模更小的子問題。


參考《程序設計抽象思想》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章