《剑指offer》【面试题九:斐波那契数列】

面试题九:斐波那契数列

对于需要进行多次重复计算的问题的时候,我们会遇到循环,或者递归。递归是在一个函数的内部调用这个函数本身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复运算。
递归虽然比较简洁,但是由于递归是函数调用自身,而函数调用是有时间和空间消耗的;每一次函数调用,都需要在内存栈中分配空间以保存参数,返回地址及临时变量,而且往栈里压入数据和弹出数据都需要时间;
除了效率之外,递归还有可能引起更严重的问题:调用栈溢出,我们知道函数在每次调用的时候都会在函数调用点分配空间,而函数调用是在栈上的,所以当进行多次递归调用的话就会出现栈溢出,而相应的循环则不会出现这种问题。

面试题九:斐波那契数列
题目:
写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。
斐波那契定义如下:
0 n = 0;
f(n) = 1 n = 1;
 f(n-1)+f(n-2) n > 1;

定义: 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

图解:


代码实现:

#include <iostream>
using namespace std;

//递归实现:
long long Fibonacci(int n)
{
	if (n <= 0)
	{
		return 0;
	}
	if (n == 1)
	{
		return 1;
	}
	return Fibonacci(n-1)+Fibonacci(n-2);
}

//循环实现:
long long Fibonacci_round(int n)
{
	long long fib_data1 = 0;
	long long fib_data2 = 1;
	if (n <= 0)
	{
		return fib_data1;
	}
	if (n == 1)
	{
		return fib_data2;
	}
	long long fib_sum = 0;
	for (int i = 2; i<=n; ++i)
	{
		fib_sum = fib_data1+fib_data2;
		fib_data1 = fib_data2;
		fib_data2 = fib_sum;
	}
	return fib_sum;
}

int main()
{
	//递归实现测试用例:
	cout<<"递归实现斐波那契数列:"<<endl;

	//功能测试:斐波那契数列第3项;
	int n1 = 3;
	cout<<"斐波那契数列第"<<n1<<"项值为: "<<Fibonacci(n1)<<endl;
	//功能测试:斐波那契数列第5项;
	int n2 = 5;
	cout<<"斐波那契数列第"<<n2<<"项值为: "<<Fibonacci(n2)<<endl;
	//功能测试:斐波那契数列第10项;
	int n3 = 10;
	cout<<"斐波那契数列第"<<n3<<"项值为: "<<Fibonacci(n3)<<endl;

	//边界值测试:斐波那契数列第0项;
	int n4 = 0;
	cout<<"斐波那契数列第"<<n4<<"项值为: "<<Fibonacci(n4)<<endl;
	//边界值测试:斐波那契数列第1项;
	int n5 = 1;
	cout<<"斐波那契数列第"<<n5<<"项值为: "<<Fibonacci(n5)<<endl;
	//边界值测试:斐波那契数列第2项;
	int n6 = 2;
	cout<<"斐波那契数列第"<<n6<<"项值为: "<<Fibonacci(n6)<<endl;

	//性能测试:斐波那契数列第40项;
	int n7 = 40;
	cout<<"斐波那契数列第"<<n7<<"项值为: "<<Fibonacci(n7)<<endl;
	//性能测试:斐波那契数列第50项;
	int n8 = 50;
	cout<<"斐波那契数列第"<<n8<<"项值为: "<<Fibonacci(n8)<<endl;
	//性能测试:斐波那契数列第100项;
	int n9 = 100;
	cout<<"斐波那契数列第"<<n9<<"项值为: "<<Fibonacci(n9)<<endl;
	

	//循环实现测试用例:
	
	cout<<endl<<endl<<"循环实现斐波那契数列:"<<endl;

	//功能测试:斐波那契数列第3项;
	int n_1 = 3;
	cout<<"斐波那契数列第"<<n_1<<"项值为: "<<Fibonacci_round(n_1)<<endl;
	//功能测试:斐波那契数列第5项;
	int n_2 = 5;
	cout<<"斐波那契数列第"<<n_2<<"项值为: "<<Fibonacci_round(n_2)<<endl;
	//功能测试:斐波那契数列第10项;
	int n_3 = 10;
	cout<<"斐波那契数列第"<<n_3<<"项值为: "<<Fibonacci_round(n_3)<<endl;

	//边界值测试:斐波那契数列第0项;
	int n_4 = 0;
	cout<<"斐波那契数列第"<<n_4<<"项值为: "<<Fibonacci_round(n_4)<<endl;
	//边界值测试:斐波那契数列第1项;
	int n_5 = 1;
	cout<<"斐波那契数列第"<<n_5<<"项值为: "<<Fibonacci_round(n_5)<<endl;
	//边界值测试:斐波那契数列第2项;
	int n_6 = 2;
	cout<<"斐波那契数列第"<<n_6<<"项值为: "<<Fibonacci_round(n_6)<<endl;

	//性能测试:斐波那契数列第40项;
	int n_7 = 40;
	cout<<"斐波那契数列第"<<n_7<<"项值为: "<<Fibonacci_round(n_7)<<endl;
	//性能测试:斐波那契数列第50项;
	int n_8 = 50;
	cout<<"斐波那契数列第"<<n_8<<"项值为: "<<Fibonacci_round(n_8)<<endl;
	//性能测试:斐波那契数列第100项;
	int n_9 = 100;
	cout<<"斐波那契数列第"<<n_9<<"项值为: "<<Fibonacci_round(n_9)<<endl;
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值