遞歸的理解

都說遞歸的是神,迭代的是人,這個就是學習筆記,記一下我的一些理解
hit2015spring

理解方式1
1、當n=0,1 時,結果正確
2、假設函數對於n 是正確的,函數對於n+1 結果也是正確的,如果這兩點是成立的,這個函數對於所有可能的n 也是成立的
像是數學歸納法的理解

理解方式2
把規模大的問題分解爲規模小的問題,大問題的解決方法,和小問題的解決方法是同一個方法,然後又明顯的結束條件。

理解方式3
規模大的問題變成一個小問題+在此基礎上的一個剩餘的解決方法,自己解決

遞(去)——>歸(來)

1有去無回的方式:去:分解問題的路上解決問題
2有去有回的方式:去:分解問題,回:解決問題

例子:斐波那契數列,漢諾塔,階乘問題

階乘:

int factorial(int n)
{
    if (n == 1 || n == 0)
        return 1;
    else
        return n*factorial(n - 1);
}

斐波那契數列

int Fibonacci(int n){
    if (n <= 1)  
        return n;  
    else  
        return Fibonacci(n-1) + Fibonacci(n-2);  
}

漢諾塔問題

void Hanoi (int n, char A, char B, char C){
    if (n==1){ //end condition
        move(A,B);//‘move’ can be defined to be a print function
    }
    else{
        Hanoi(n-1,A,C,B);//move sub [n-1] pans from A to B
        move(A,C);//move the bottom(max) pan to C
        Hanoi(n-1,B,A,C);//move sub [n-1] pans from B to C
    }
}

如何找到問題的遞歸解法

1、 如何解決問題的一般情況,通過將問題切分成有限小,並更小的問題
2、如何通過有限的步驟解決最小的問題(基本的問題)

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