• 斐波那契数列


    1. 斐波那契数列

    写一个函数,输入n,求斐波那契(fibonacci)数列的第n项,斐波那契数列定义f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) (n>1)

    1递归解法

    <pre name="code" class="cpp">long long fibonacci_recursive(int n)
    {
    	if (n <= 0)
    	{
    		return 0;
    	}
    	if (1 == n)
    	{
    		return 1;
    	}
    	return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2);
    }
    
    

    2非递归解法

    long long fibonacci_Iterative(int n)
    {
    	if (n <= 0)
    	{
    		return 0;
    	}
    	if (1 == n)
    	{
    		return 1;
    	}
    	long long fibNMinusOne = 1, fibNMinusTwo = 0;
    	long long fibN;
    	for (int i = 2; i <= n; ++i)
    	{
    		fibN = fibNMinusOne + fibNMinusTwo;
    		fibNMinusTwo = fibNMinusOne;
    		fibNMinusOne = fibN;
    	}
    	return fibN;
    }


    斐波那契数列属于动态规划问题,因此採用非递归方式(1)节省了递归调用的不必要开销;(2)避免了反复计算。

    2. 青蛙跳台阶

    2.1 题目

    一仅仅青蛙一次能够跳上1级台阶,也能够跳上2级。求该青蛙跳上一个n级台阶共同拥有多少种跳法。

    分析:该问题明显属于动态规划问题。设f(n)表示跳n级台阶的跳法种数。

    (1) n=0时。无意义。

    (2) n=1时,仅仅有1种跳法。

    (3) n=2时,共同拥有2种跳法。

    (4)n>2时,若第1次跳1级台阶,则剩余n-1级台阶;若第1次选择跳2级台阶,则剩余n-2级台阶。换句话说,n级台阶的跳法能够转化为n-1级与n-2级台阶问题。即f(n) = f(n-1)+f(n-2)。

    综上。青蛙跳台阶问题能够表述为公式:f(1)=1, f(2)=2, f(n)=f(n-1)+f(n-2) (n>2) 

    该公式与斐波那契数列公式同样。但应注意不存在f(0)。

    2.2 题目扩展

    将2.1中的条件改成:一仅仅青蛙一次能够跳随意大于0级台阶,此时青蛙跳n级台阶总共同拥有多少种跳法?证明f(n)=2n-1

    分析:类似于题目2.1有f(1) = 1,f(2)=2,当n>2时f(n) = f(n-1)+f(n-2)+…+f(1)+1,分别相应青蛙第一次跳1级、2级、…、n级。

    因此该问题也能够用类似于斐波那契数列的方法实现,但对于非递归实现,因n级台阶的计算须要用到全部小于n级台阶的跳法,因此n个变量用于存储计算值,可申请长度为n的long long指针实现。

    递归方法证明f(n)=2n-1

    (1) i=1,2时显然分别有f(1)=1=21-1与f(2)=2=22-1种跳法。

    (2) 如果i<n时有f(i)=2i-1。则i=n时,由分析中的递推公式可得f(i)=f(i-1)+f(i-2)+…+f(1)=2i-2+2i-3+…+21-1+1=2i-1(等比公式),即f(n)=2n-1

    综上所述,f(n)=2n-1

    由于有了递推公式因此也能够用迭代法证明f(n)=2n-1

  • 相关阅读:
    118.Java_前定义
    117.数据结构概述(定义,基本术语,层次)
    116.C语言_文件
    115.C语言_函数
    java数组
    sql语句学习(第二季
    linux查看内存
    增强型for和Iterator学习
    ArrayList和LinkedList
    java并发回答
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6872408.html
Copyright © 2020-2023  润新知