都說遞歸的是神,迭代的是人,這個就是學習筆記,記一下我的一些理解
理解方式1
1、當
2、假設函數對於
像是數學歸納法的理解
理解方式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、如何通過有限的步驟解決最小的問題(基本的問題)