递归算法 -->第3关:青蛙跳台阶问题 第4关:猴子吃桃问题 第5关:苹果分筐问题

文章提供了三个编程挑战,分别是青蛙跳台阶问题、猴子吃桃问题和苹果分筐问题,均涉及递归算法的使用。青蛙跳台阶问题要求计算在给定台阶数下,青蛙的不同跳法数;猴子吃桃问题通过倒推计算第一天摘桃的数量;苹果分筐问题则需要找出在限制条件下苹果的不同分配方式。每个问题都给出了递归解法的代码示例。
摘要由CSDN通过智能技术生成

第3关:青蛙跳台阶问题

任务描述

本关任务:一只小青蛙,每次跳台阶,他可以一下跳一个台阶,或者两个台阶,问假设有n个台阶,这只青蛙一共有多种跳的方法。

题目分析

假设小青蛙最后站在第n阶梯,那么它最后一次是怎么跳上来的呢?可以是跳一级上来,也可以是跳两级上来。假设f(n)是小青蛙跳到n个台阶的方法数。

编程要求

根据提示,在右侧编辑器补充代码,计算n个台阶共有多少总跳法。

测试说明

平台会对你编写的代码进行测试,需要输入的台阶数是大于等于1的整数,如果小于等于0,则返回-1。

测试输入:2 预期输出:2

测试输入:5 预期输出:8

#include<iostream>
using namespace std;
int frog(int n)
{
   if(n==1)//剩一个台阶,有一种跳法
   {
      return 1;
   }
   else if(n==2)剩两个台阶,有两种跳法
   {
      return 2;
   }
   else
   {
      return frog(n-1)+frog(n-2);//分最后剩一步台阶和最后剩两步台阶的情况,相加
   }

}
int main()
{
   int n=0,t=0;
   scanf("%d",&n);
   if(n<=0)//判断输入是否符合
   {
      t=-1;
   }
   else
   {
     t=frog(n);
   }
   printf("%d",t);
   return 0;
}

 

 

第4关:猴子吃桃问题 

任务描述

猴子第一天摘下若干个桃子,当天吃了一半,后面又多吃一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。后面每天猴子都吃了前一天剩下的一半零一个。到第10天想再吃时,只剩下一个桃子。问第一天共摘了多少桃子。 如果仍然是这种吃法,第15天再吃时,也是只剩下一个桃子,那第一天摘的桃子数又是多少?

题目分析

  • 可以倒着思考,第15天为最后一天,设桃子数为S(15)
  • 已知S(15)=1,第14天,设为S(14),去掉它的一半多1个就是S(15).
  • 只要根据S(n-1)S(n)的关系,就可以用递归求解得到S(1)

编程要求

根据提示,在右侧编辑器补充代码,求解到第n天想再吃时,只剩下一个桃子,第一天共摘的桃子数。

测试说明

当输入的天数n小于1时,返回-1. 平台会对你编写的代码进行测试: 测试输入:4 预期输出:22

 

#include<iostream>
using namespace std;
int PeachNumber(int n)
{
    if(n==1)
    {
        return 1;//将第15天的数记为第一天的桃子数
    }
    else
    {
        return (PeachNumber(n-1)+1)*2;//前一天吃的桃子数为后一天吃的桃子树+1再*2
    }

}
int main()
{
    int n=0,num=0;
    scanf("%d",&n);
    if(n<1)//判断输入数是否符合
    {
        num=-1;
    }
    else
    {
        num=PeachNumber(n);
    }
    
    printf("%d",num);
    return 0;

}

 

第5关:苹果分筐问题 

任务描述

本关任务:有n个苹果,现分成k筐,每筐不能为空,有多少种分法? 比如7个苹果成3筐,可以是{1,1,5}, 但这里不考虑顺序,比如我们认为{1,1,5}{1,5,1}{5,1,1}是同一种分法。

一种思路

  1. 考虑第1筐,假设放入i个苹果,它不能大于kn​,因为大于该数,就会产生重复的划分。
  2. 剩下的n-i个苹果,继续放到k-1个筐,它的个数不能多于k−1n−i​,不能少于前一筐个数。
  3. 直到k==1为止。
  • 比如输入 7 4
  • 按该方法第1筐可放1或2
  • 当第1筐放1时,第2筐可以放1或2或3
  • 当第1筐放2时,第2筐只可放2或3
  • ...
第1筐第2筐第3筐
115
124
133
223

输入格式

两个整数n,k,(6<n≤200,2≤k≤6),中间用单个空格隔开。

输出格式

一个整数,即不同分法。

测试说明

平台会对你编写的代码进行测试:

测试输入:7 3 预期输出:4

#include<iostream>
using namespace std;
//n个苹果分k筐,现在到第now筐
int divideNumber(int n, int k, int now)
{
    int count = 0;//计共有多少种方法
    if (k == 1)//分到最后一个筐子就算一种分发
    {
        return 1;
    }
    else
    {
        
        for (int i = now; i <= (n / k); i++)//后一个筐子的苹果个数>=前一个筐子的苹果数量
        {
            count = count + divideNumber(n - i, k - 1, i);//i为前一个筐子的苹果数量
        }
        return count;
    }

}

int main()
{
    int n = 0, k = 0, t = 0;
    scanf_s("%d %d", &n, &k);
    t = divideNumber(n, k, 1);//初始第一个筐的苹果数量为1
    printf("%d", t);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值