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