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

本文深入探讨了递归在计算斐波那契数列中的应用,通过对比递归与循环实现方式,揭示了递归的原理与效率考量,并进一步阐述了一般递归模型的概念,旨在提升对递归的理解与应用能力。

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

先看代码:

递归实现

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


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








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值