都说递归的是神,迭代的是人,这个就是学习笔记,记一下我的一些理解
hit2015spring晨凫追风
理解方式1
1、当
n=0,1
时,结果正确
2、假设函数对于
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、如何通过有限的步骤解决最小的问题(基本的问题)