C语言_函数的递归_青蛙跳台阶(三种情况)

第一种

一共有5个台阶,每一次可以跳一个或两个台阶。
思路:设完成跳台阶的函数是jump(5)
完成这个动作最后可能有

  1. 最后跳了一下就跳完了;
  2. 最后跳了两下就跳完了;
    1——它的位置在第四个台阶,跳到这里要jump(4);
    2——它的位置在第三个台阶,跳到这里要jump(3);
    所以在这种情况下jump(5)=jump(4)+jump(3).

我们再将总共的台阶数看成n个
最后可能情况为

  1. 最后跳了一下就跳完了;
  2. 最后跳了两下就跳完了;
    与上一种情况相同;
    jump(n)=jump(n-1)+jump(n-2)
    (注意当n=1时有一种方法,n=2时有两种方法作为结束递归的出口)
    //这里讨论1或2的原因
    eg:n=3时=jump(2)+jump(1);如果不考虑n=2有两种情况
    jump(2)=jump(1)+jump(0)=1但实际上n=2时有两种情况,会出现错误。
    对应代码实现为
    在这里插入图片描述
    观察输出结果
    在这里插入图片描述
    发现是斐波那契数。

第二种

一共n个台阶,每次可以跳1,2,3到n个台阶。
根据上面的分析
最后可能的情况为:
剩一个,剩两个…剩n个;
//剩n个到此位置的方法为0;jump(0)=0
jump(n)=jump(n-1)+jump(n-2)…+jump(0);——1
———————一共n个———————
对应jump(n-1):
jump(n-1)=jump(n-2)+…jump(0);——2
1式与2式联立求解
jump(n)=jump(n-1)+jump(n-1)=2*jump(n-1);
对应代码:

在这里插入图片描述
输出结果
在这里插入图片描述

第三种

有n个台阶,每次可以跳1,2,3…m个台阶
因为m与n的大小未知所以要讨论
当m>=n时
跳到最后的可能情况:
剩n个,剩n-1个,…剩1个;
所以这种情况和第二种相同,
jump(n)=2*jump(n-1)

当m<n
跳到最后可能的情况
剩m个跳完——在此位置可能情况jump(n-m)
剩m-1个跳完——位置可能情况jump(n-(m-1))

剩一个跳完——可能情况jump(n-1)

此时
jump(n)=jump(n-1)+jump(n-2)…+jump(n-m);
jump(n-1)=jump(n-2)…jump(n-m)+jump(n-m-1);
联立求解
jump(n)=jump(n-1)+jump(n-1)-jump(n-m-1);
jump(n)=2*jump(n-1)-jump(n-m-1);

对应代码
在这里插入图片描述
在这里插入图片描述
输出结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/dodamce/article/details/113073197