斐波那契数列11

来源:互联网 发布:软件部门管理制度 编辑:程序博客网 时间:2024/06/16 05:36

递归和循环:
递归:是在一个函数的内部调用这个函数自身。
循环:是通过设置计算的初始值终止条件,在一个范围内重复计算。

递归缺点:

  1. 函数调用的时间、空间消耗:每一次调用,都需要在内存栈里分配空间以保存函数参数返回地址临时变量
  2. 递归中可能很多计算是重复的。
  3. 调用栈溢出:每个进程的栈的容量是有限的。若递归调用层级太多,就会超出栈的容量,导致栈溢出。

斐波那契数列
题目描述: 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。

Fibonacci定义如下:
f(n) = { 0 n=0;}
f(n) = { 1 n=1;}
f(n) = { f(n-1)+f(n-2) n>1;}

解题思路:递归效率低,使用迭代。从下往上计算,首先根据f(0)和f(1)算出f(2); 再根据f(1)和f(2)算出f(3), 依次计算, 主要是借助3个临时变量。

测试用例:

int main(){    //求10的斐波那契数列    int number = 10;    std::cout << "Number's fibonacci is: " << Fibonacci(number);  //Output: 55    return 0;}

Fibonacci函数实现:

long long Fibonacci(unsigned int n){ //无符号n    //临时数组,如果n为0或1时,可直接返回处理    int result[2] = {0, 1};    if(n < 2)        return result[n];    //三个临时变量    long long fibMinusOne = 1;   //f(n-1)    long long fibMinusTwo = 0;   //f(n-2)    long long fibN = 0;   //f(n)    for(auto i = 2; i <= n; ++i){        fibN = fibMinusOne + fibMinusTwo;//初始执行n=2的情况        fibMinusTwo = fibMinusOne;         fibMinusOne = fibN;    }    return fibN;}

题目二:一只青蛙依次可以跳上1级台阶, 也可以跳上2级。求青蛙跳上一个n级的台阶总共有多少种跳法。

解题思路:实际上这是一个Fibonacci数列的例子, 使用公式f(n) = f(n-1) + f(n-2)便可求出跳一个n级的台阶有多少种跳法。

0 0