斐波那契数列 && 青蛙跳台阶 && 变态跳台阶

目录

一、斐波那契数列

二、青蛙跳台阶问题

三、变态跳台阶


一、斐波那契数列

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

思路:用递归的方法,f(n) =f(n-1) + f(n-2)。代码比较简单。

#include<iostream>
using namespace std;

int Fibonacci(int n)
{
	if(n <= 0)
	{
		return 0;
	}
	if(n == 1)
	{
		return 1;
	}
	return Fibonacci(n-1)+Fibonacci(n-2);
}

int main()
{
	cout << Fibonacci(-1) << " ";
	cout << Fibonacci(0) << " ";
	cout << Fibonacci(1) << " ";
	cout << Fibonacci(2) << " ";
	cout << Fibonacci(3) << " ";
	cout << Fibonacci(4) << " ";
	cout << Fibonacci(5) << " ";
	return  0;
}

上面的代码如果n的值较大,递归的次数较多,就会造成栈溢出。

代码优化:

思路:可以用循环将数字从开始加到n。

#include<iostream>
using namespace std;

int Fibonacci(int n)
{
	int f1 = 1;
	int f2 = 1;
	int f3 = 0;
	if(n <= 0)
	{
		return 0;
	}
	if(n == 1 || n == 2)
	{
		return 1;
	}
	while(n > 2)
	{
		f3 = f1+f2;
		f1= f2;
		f2= f3;
		n--;
	}
	return f3;
}

int main()
{
	cout << Fibonacci(-1) << " ";
	cout << Fibonacci(0) << " ";
	cout << Fibonacci(1) << " ";
	cout << Fibonacci(2) << " ";
	cout << Fibonacci(3) << " ";
	cout << Fibonacci(4) << " ";
	cout << Fibonacci(5) << " ";
	return  0;
}

 

二、青蛙跳台阶问题

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

思路:一级台阶只有一种跳法。两级台阶可以一次跳一级,也可以一次跳两级,一共两种方法。如果是三级的话,就是从二阶或者从一阶跳上来,以此类推,所以可以用递归的方式。

#include<iostream>
using namespace std;

int JumpFloor(int n)
{
	if( n <= 0)
	{
		return 0;
	}
	if( n == 1 || n == 2 )
	{
		return n;
	}
	return JumpFloor(n-1) + JumpFloor(n-2);
}

int main()
{
	cout << JumpFloor(0) << endl;
	cout << JumpFloor(1) << endl;
	cout << JumpFloor(2) << endl;
	cout << JumpFloor(3) << endl;
	cout << JumpFloor(4) << endl;
	cout << JumpFloor(5) << endl;
	return 0;
}

代码优化,思路和上面的例子相同。

#include<iostream>
using namespace std;

int JumpFloor(int n)
{
	
	if( n <= 0)
	{
		return 0;
	}
	if( n == 1 || n == 2)
	{
		return n;
	}
	int f1 = 1;
	int f2 = 2;
	int f3 = 0;
	while(n > 2)
	{
		f3= f1+f2;
		f1 = f2;
		f2 = f3;
		n--;
	}
	return f3;
}

int main()
{
	cout << JumpFloor(0) << endl;
	cout << JumpFloor(1) << endl;
	cout << JumpFloor(2) << endl;
	cout << JumpFloor(3) << endl;
	cout << JumpFloor(4) << endl;
	cout << JumpFloor(5) << endl;
	return 0;
}

三、变态跳台阶

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

思路:当有一级台阶时,跳法::0->1。

            当有二级台阶时,跳法: 0->1->2 ,0->2。

            当有三级台阶时,跳法: 0->1->2->3,0->1->3, 0->2->3, 0->3。

            当有四级台阶时,跳法: 0->1->2->3->4,0->1->2->4,0->1->3->4, 0->1->4,0->2->3->4,0->2->4,0->3->4,0->4。

规律:f(n) = 2^(n-1)。

#include<iostream>
using namespace std;

int JumpFloor(int n)
{
	if(n <= 0)
	{
		return 0;
	}
	if(n == 1 || n == 2)
	{
		return n;
	}
	return 2 *JumpFloor(n-1) ;
}

int main()
{
	cout << JumpFloor(-1) << endl;
	cout << JumpFloor(0) << endl;
	cout << JumpFloor(1) << endl;
	cout << JumpFloor(2) << endl;
	cout << JumpFloor(3) << endl;
	cout << JumpFloor(4) << endl;
	cout << JumpFloor(5) << endl;
}

优化:

int JumpFloor(int n)
{
	if(n <= 0)
	{
		return 0;
	}
	if(n == 1)
	{
		return 1;
	}
	int count = 1;
	while(n-1 != 0)
	{
		count *= 2;
		n--;
	}
	return count;
}

int main()
{
	cout << JumpFloor(-1) << endl;
	cout << JumpFloor(0) << endl;
	cout << JumpFloor(1) << endl;
	cout << JumpFloor(2) << endl;
	cout << JumpFloor(3) << endl;
	cout << JumpFloor(4) << endl;
	cout << JumpFloor(5) << endl;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值