爬楼梯递归解决

从现在开始,小编正式与你一起解决爬楼梯问题

问题1
假设你现在正在爬楼梯,楼梯有n级。每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部?
分析
要想解决这个问题,很明显,你有俩个解决办法,一个是模拟人脑处理问题的办法,动态规划法,一种是与人脑思维方式相反的方法设X法…此处烧脑中ing…(递归法)
小编重点带你研究递归的方法,动态规划法对于这道题很遗憾我想不到实现的方法。
我们以5为例
在这里插入图片描述
这就是小编所有的走路的过程,虽然图画的有点丑,但就是那个意思,每次只能走一步或者两步。我们要想知道我们有5 个台阶,每次只能走一步或者两步的情况的总数,只需要最下面的和加起来就可以,我们现在来解决为什么下面的相加就可以。
1.一个最下面就是一个可行的方案对不对
2.只剩下一个台阶有1种可以走的办法。 ,只剩下2个台阶有两种可以走的办法。
下面附上我的程序代码

#include <iostream>
using namespace std;
 
 int sum=0;
 //n个台阶,每个台阶最多可以走4个 
int function(int n){
    if(n==0)
    
    {   
    	return 0;
	}
       
    else if(n==1)
      {
      	sum+=1;
        return 1;
	   } 
    else if(n==2)
        {
        	sum+=2;
           return 2;
		}
	
    else if(n>2) 
        return function(n-1)+function(n-2);
}
 
 
int main(){
   int n;
   cin>>n;
   function(n);
   cout<<sum<<endl;
   return 0;
}

代码解释
在这里插入图片描述
读懂这张图,或许你对递归有了一定的认识,这就是树。将不能解决的东西待定以下,等到树梢的时候再解决就把所有的情况都解决了。
问题2
小明参加一个大题比赛,答对了,加4分,答错或不答扣1分,有25道题,得了70分,求答对了几道。

#include <iostream>
using namespace std;
 
 int sum=0;
 int count1=0;
 int count=0;-
int function(bool n)
{
   if(n==true)
   {
   	count+=1;
   	sum+=4;
   }
  else
  {
  	sum-=1;
  }
}
int main()
{
  
   for(int a=0;a<=1;a++)
   {
   	   for(int b=0;b<=1;b++)
   {
   	   for(int c=0;c<=1;c++)
   {
   	   for(int d=0;d<=1;d++)
   
   	   
   {
   	   for(int e=0;e<=1;e++)
   {
   	   for(int f=0;f<=1;f++)
   {
   	   for(int g=0;g<=1;g++)
   {
   	  for(int h=0;h<=1;h++)
   {
   	   for(int i=0;i<=1;i++)
   {
   	  for(int j=0;j<=1;j++)
   {
   	  for(int k=0;k<=1;k++)
   {
   	  for(int l=0;l<=1;l++)
   {
   	   for(int m=0;m<=1;m++)
   {
   	  for(int n=0;n<=1;n++)
   {
   	  for(int o=0;o<=1;o++)
   {
   	  for(int p=0;p<=1;p++)
   {
   	  for(int q=0;q<=1;q++)
   {
   	  for(int r=0;r<=1;r++)
   {
   	  for(int s=0;s<=1;s++)
   {
   	  for(int t=0;t<=1;t++)
   {
   	  for(int u=0;u<=1;u++)
   {
   	  for(int v=0;v<=1;v++)
   {
   	  for(int w=0;w<=1;w++)
   {
   	  for(int x=0;x<=1;x++)
   {    for(int y=0;y<=1;y++)
        { sum=0;
          count=0;
          function(a);
          function(b);
          function(c);
          function(d);
          function(e);
          function(f);
          function(g);
          function(h);
          function(i);
          function(j);
          function(k);
          function(l);
          function(m);
          function(n);
          function(o);
          function(p);
          function(q);
          function(r);
          function(s);
          function(t);
          function(u);
          function(v);
          function(w);
          function(x);
           function(y);
           if(sum==70)    
		   {    
		       if(count!=count1)
		       {
		       	cout<<count<<endl;
				  count1=count;   
			   }
		   	   
		  }      
               
   }
   }
   }
   }
   }
   }
   }
   }
   }
   }
   }
   }
   }
   }
   }
   }
   }
   
   }
   }
   }
   }
   	
   }
   }
   }
}
   return 0;
}

这种算法是不是相当暴力,不过这种算法是不是你也可以有启发,比如11111100000这是11种情况,前面6种答对,后面5种答错,你就可以用这种类似的算法求值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值