斐波那契数列

斐波那契数列


斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34…
此为第一种方法,用循环来解决这个问题,代码如下:

public static int forFibonacci(int n) {
        //判断n<0时,直接返回一个没有用的值
		if(n<0)return -1;
		//当n=1或n=2时直接返回1
		if(n==1||n==2) {
			return 1;
		}
		//定义a、b和sum用来接收值
		int a=1;
		int b=1;
		int sum=0;
		//利用for循环进行累加
		for(int i=2;i<n;i++) {
			sum=a+b;
			a=b;
			b=sum;
		}
		//返回sum即为所要求的第n位数的总和
		return sum;
	}

可以看出如上的代码虽然可以求出每一个n所对应的斐波那契数列的值,但时代码相对较为繁琐,不够简洁。
此时我们可以利用迭代的方式来进行对代码的简洁化
迭代的三要素:
1.找到临界点
2.满足临界点的解决办法
3.提取相同的逻辑

public static int iterationFibonacci(int n) {
		if(n<0)return -1;
		if(n==1||n==2) {
			return 1;
		}
		return iterationFibonacci(n-1)+iterationFibonacci(n-2);
	}

如上,代码相比利用循环时简洁不少,但是在计算过程中还是有许多的重复项被计算。例如:
如果我们想求的是f(5);由于f(2)=f(1)=1,故求值到f(2)和f(1)出现即可。
f(5)=f(4)+f(3)展开计算f(4)和f(3)
即又需要计算f(4)=f(3)+f(2)和f(3)=f(2)+f(1)继续展开计算f(3)
f(3)=f(2)+f(1)
此时可以看出f(3)被展开计算了两次,如果n足够大,那么被重复计算的数就越来越多,因此需要对该代码进行优化

 public static int optimizeFibonacci(int first,int second,int n){
        if(n<0) return -1;
        if (n==3){
            return first+second;
        }
        return optimizeFibonacci(second,first+second,n-1);
    }

现有斐波那契数列:1 1 2 3 5 8 13 21 34
此时定义了两个值,first和second

要计算第7位的斐波那契数值
这时n=7,first=1,second=1,
此时假设n作为第6位置时,(实际不变),此时first=1,second=2
继续假设n作为第5位置时,(实际不变),此时first=2,second=3
继续假设n作为第4位置时,(实际不变),此时first=3,second=5
继续假设n作为第3位置时,(实际不变),此时first=5,second=8
继续假设n作为第2位置时,此时first=8,second=13
继续假设n作为第1位置时,此时first=13,second=21
结果返回:
当n=1时返回first的值就为所求的值
当n=2时返回second的值就为所求的值
当n=3时返回(first+second)的值就为所求的值
(故代码中,当n=3时直接可以得到所要求得得斐波那契数值)
优化后的代码就不存在重复计算,依旧简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值