透过斐波那契数列学习函数递归

来源:互联网 发布:网络歌曲下载 编辑:程序博客网 时间:2024/05/16 02:48

今天看了递归的部分,自己写了个斐波那契,作为学习递归调用的例子。

先看代码:

递归实现

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=2f(n) = f(n - 1) + f(n - 2) n > 2

很明显,递归循环都要有一个出口,这里,n为1或者2时为递归的出口。那么更一般的递归模型如下:

f[s1] = m1f[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是一个非递归函数,可以直接求解。


从上面可以看出,递归就是将一个不能解决或者是不好解决的“大问题”,转换成可解决的“小问题”。且递归分解得保证“大小问题”相似,即求解过程和环境都相似。








0 0
原创粉丝点击