今天看了递归的部分,自己写了个斐波那契,作为学习递归调用的例子。
先看代码:
递归实现
public int fibonacci_DiGui(int number) {
if (number == 1 || number == 2) {
return 1;
} else {
return fibonacci_DiGui(number - 1) + fibonacci_DiGui(number - 2);
}
}
循环实现
public int fibonacci_XunHuan(int n) {
int last = 0, current = 0, next;
for (int i = 1; i <= n; i++) {
if (i == 1) {
last = 0;
current = 1;
} else if (i == 2) {
last = 1;
current = 1;
} else {
next = last + current;
last = current;
current = next;
}
}
return current;
}
由上可以得出,斐波那契数列的数学表达式
f(n) = 1 n=1 || n=2
f(n) = f(n - 1) + f(n - 2) n > 2
很明显,递归循环都要有一个出口,这里,n为1或者2时为递归的出口。那么更一般的递归模型如下:
f[s1] = m1
f[s(n+1)] = g(f[s(i)],f[s(i+1)],f[s(i+2)],...,f[s(n)],c(j),c(j+1),...,c(m))
这里s1和m1都是常量,也是递归出口。第二式的n,i,j,m都是正整数,s(n+1) 是一个待递归的“大问题”,而s(i),s(i+1),s(i+2)都是递归“小问题”,c(j),c(j+1),...,c(m)都是若干个可以直接求解的问题,g是一个非递归函数,可以直接求解。
从上面可以看出,递归就是将一个不能解决或者是不好解决的“大问题”,转换成可解决的“小问题”。且递归分解得保证“大小问题”相似,即求解过程和环境都相似。