斐波那契数列的相关问题及算法实现

最初的问题是一个跳台阶问题引出的。

一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。总共有多少种跳法,并分析算法的时间复杂度。

分析一:递归法

一个台阶那么只有一种方法。如果有两级台阶,就有跳一个台阶和挑两个台阶,就是2种方法。

   当n>2时,第一次跳的时候就有两种不同的选择:

  • 一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);
  • 另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)

推广到n级台阶,就有f(n)=f(n-1)+f(n-2)

总结成公式:

        /  1                             n = 1
f(n)=      2                             n = 2
        \  f(n-1) + f(n-2)               n > 2
long long Fibonacci(unsigned int n)
{
      int result[3] = {0,1,2};
      if(n<=2)
              return result[n];

      return Fibonacci(n-1) + Fibonacci(n-2); 
}


那么,如果一个人上台阶可以一次上1个,2个,或者3个呢?这个时候,公式是这样写的:

        / 1                                      n = 1
f(n)=     2                                      n = 2
          4                                      n = 3       //111, 12, 21, 3
        \ f(n-1)+f(n-2)+f(n-3)                   n > 3
参考代码如下:

long long Fibonacci(unsigned int n)
{
	int result[2] = { 0, 1 };
	if (n < 2)
		return result[n];
	long long a = 1, b = 0, c = 0;
	for (unsigned i = 0; i < n; i++)
	{
		c = a + b;
		b = a;
		a = c;
	}
	return c;
}

时间复杂度为O(n),空间复杂度为O(1)。

下面转载july的相关扩展问题

1、兔子繁殖问题

13世纪意大利数学家斐波那契在他的《算盘书》中提出这样一个问题:有人想知道一年内一对兔子可繁殖成多少对,便筑了一道围墙把一对兔子关在里面。已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后.第三个月开始生小兔子假如一年内没有发生死亡,则一对兔子一年内能繁殖成多少对?

分析:这就是斐波那契数列的由来,本节的跳台阶问题便是此问题的变形,只是换了种表述形式。

2、换硬币问题。

想兑换100元钱,有1,2,5,10四种钱,问总共有多少兑换方法。

const int N = 100;
int dimes[] = { 1, 2, 5, 10 };
int arr[N + 1] = { 1 };
for (int i = 0; i < sizeof(dimes) / sizeof(int); ++i)
{
    for (int j = dimes[i]; j <= N; ++j)
    {
        arr[j] += arr[j - dimes[i]];
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值