问题一、走台阶问题(递归和动态规划)

【本期题目】 

1、斐波那契系列问题的递归和动态规划

【题目】

给定整数N,返回斐波那契数列的第N项。

【补充题目1】

给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法。

【举例】

N=3。可以三次都跨1个台阶;也可以先跨2个台阶,再跨1个台阶;还可以先跨1个台阶,再跨2个台阶。所以有三种走法,返回3。

【补充题目2】

假设农场中成熟的母牛每年只会生1头小母牛,并且永远不会死。第一年农场有1只成熟的母牛,从第二年开始,母牛将开始生小母牛。每只小母牛3年之后成熟又可以开始生小母牛。给定整数N,求出N年后牛的数量。

【举例】

N=6。第1年1头成熟母牛记为a。第2年a生了新的小母牛记为b,总牛数为2。第3年a生了新的小母牛记为c,总牛数为3。第4年a生了新的小母牛记为d,总牛数为4。第5年b成熟了,a和b分别生了新的小母牛,总牛数为6。第6年c也成熟了,a、b和c分别生了新的小母牛,总牛数为9。返回9。

解答:

当前程序仅针对上述【补充题目1】解答。

未尽事宜及下一步工作:①斐波那契系列问题未进行编程,补充题目2未进行解答;②补充题目1中,退出机制的调试。③程序N值较大时,运算耗时,想办法提高算法速度。

#include<iostream>
using namespace std;


int N=0;
int count=0;


int Means(const int &N)
{
     int M=N;
     if(M<1)
        return count;
     if(M==1)
        count+=1;
     else if(M==2)
        count+=2;
     else
     {
        Means(M-1);
        Means(M-2);
     }
     return count;
}


//bool exitN(const int &N)   //退出机制没有处理好
//{
// char keyone=NULL;
// if(N=='B')
// {
// cout<<"确定要退出吗?确定(y),否则(n)";
// cin>>keyone;
// if(keyone=='y')
// return false;
// }
// return true;
//}


int main()
{
do
{
N=0;count=0;
cout<<"输入整数N,N=";
cin>>N;
cout<<Means(N)<<endl;
}while(1);
}

方法二:
int Means(const int &n)
{
	if(n<1) return 0;
	if(n==1) return 1;
	if(n==2) return 2;
	else
	{
		return Means(n-1)+Means(n-2);//上n个台阶的方法数等于上n-1个台阶和n-2个台阶方法数之和,
         //即f(n)=f(n-1)+f(n-2),n>2,f(1)=1,f(2)=2
}}int main(){while(1){int N=0;cin>>N;cout<<Means(N);}}
 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值