斐波那契数列的算法优化(递归)

目录

介绍

C++版代码

代码

算法优化

Python版代码

结尾


介绍

        众嗦粥汁,斐波那契数列(Fibonacci sequence),又称黄金分割数列,它是数学家莱昂纳多·斐波那契(Leonardo Fibonacci)发明的,它是这样排列的:

1,1,2,3,5,8......

        经过一些简单的观察,我们就可以发现它的递归关系式:

f(n)=f(n-1)+f(n-2)

C++版代码

代码

        有了上一章的递归关系式,我们就能写出一个简单的函数:

#include <iostream>
using namespace std;
long long f(int n){ // 斐波那契数列的增长非常快,n=47时就超出了int的范围,所以用long long
	if (n == 1||n == 2) return 1;
	return f(n - 1) + f(n - 2);
}

int main(){
	int n;
	cin >> n;
	cout << f(n) << endl;
}

        如果你运行就会发现:当n=38 时,程序运行的速度明显变慢了。这是因为此代码的时间复杂度为 O(2^{n}) 那我们究竟该怎么优化呢?答案下一章揭晓。

算法优化

        揭晓上一章的答案:经过我们仔细的推敲后就能发现:有些数据是重复算过的!就像这样:

f(5)=f(4)+f(3)

f(4)=f(3)+f(2)

        这里我们可以看到:f(3) 被算了两次。我们优化就可以抓住这一点。我们可以定义一个数组,把算过的数据都存在这个数组里面,需要的时候在使用它。这里涉及到一个知识点。如果把数组声明为全局变量,这时你的数组的元素个数可以比局部变量开的更加大,而且不用初始化(开发一些项目时还是尽量避开全局变量会比较好)

        我们来一步步实现:

  1. 定义一个全局数组
    long long memo[10000001];
  2. 判断之前是不是算过了,如果算过,则直接使用:
    if (memo[n]>0) return memo[n];
  3. 如果没有算过,则算一遍,然后存进数组里:
    else{
    		long long a = f(n - 1) + f(n - 2);
    		memo[n] = a;
    		return a;
    }

 完整代码:

#include <iostream>
using namespace std;
long long memo[10000001]; //把数组声明为全局变量开的空间会比较大。
long long f(int n){
	if (memo[n]>0) return memo[n];
	if (n == 1 || n == 2) return 1;
	else{
		long long a = f(n - 1) + f(n - 2);
		memo[n] = a;
		return a;
		
	}
}

int main(){
	int n;
	cin >> n;
	cout << f(n) << endl;
}

         这些代码成功的将时间复杂度降到了O(n),可谓逝坟好用。

         蛋柿,我又查到了想出来一个优化的方法:

#include <iostream>
using namespace std;
long long f(long long first, long long second, int n){
	if (n > 0){
		if (n == 1) return first;
		if (n == 2) return second;
		if (n == 3) return first + second;
		return f(second, first + second, n-1);
	}
}
int main(){
	int n;
	cin >> n;
	cout << f(1, 1, n) << endl;
}

        这个代码比之前的代码整整少算了一次(doge)虽然这计算一次用的时间基本上能忽略不计,但是,蚊子再小也是肉。所以,可以逝逝(并不代表我的代码都是错的)

Python版代码

        第一个代码:(想必没人会抄这个吧……

def f(n):
    if n == 1 or n == 2:
        return 1
    return f(n - 1) + f(n - 2)


n = int(input())
print(f(n))

        第二个:

def f(n:int):
    global a
    if n in a:
        return a[n]
    if n == 1 or n == 2:
        return 1
    else:
        b = f(n - 1) + f(n - 2)
        a[n] = b
        return b


n = int(input())
a ={}
print(f(n))

        第三个:

def f(first, second, n):
    if n > 0:
        if n == 1:
            return first
        if n == 2:
            return second
        if n == 3:
            return first + second
        return f(second, first + second, n - 1)


n = int(input())
print(f(1, 1, n))

结尾

        以上就是关于斐波那契数列的递归算法优化,Python程序输入数值不宜太大,否则会堆栈错误。所以你学废了吗

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值