青蛙跳台阶(递归)

简介: 青蛙跳台阶(递归)

首先考虑最简单的情景


青蛙一次可跳一个或两个台阶 台阶总数用N表示


当N=1时,

此时只有一种跳法,只能跳一个台阶


当N=2时,

此时有两种跳法,一次跳两个台阶或者跳两次一个台阶


当N=3时,

1.先跳一个台阶,接下来就是N=2的跳法;

2.先跳两个台阶,接下来就是N=1的跳法。

跳法总数:(N=1)+(N=2)


当N=4时,

1.先跳一个台阶,接着就是N=3的跳法;

2.先跳两个台阶,接着就是N=2的跳法

跳法总数:(N=3)+(N=2)



以此类推

当N=n时,

1.先跳一个台阶,接着就是N=n-1的跳法;

2.先跳两个台阶,接着就是N=n-2的跳法

跳法总数:(N=n-1)+(N=n-2)

#include<stdio.h>
int my_jumpsteps(int n)
{
  //先进行台阶数的判断
  if (1 == n)
  {
    return 1;
  }
  if (2 == n)
  {
    return 2;
  }
  if (n > 2)
  {
    //进行递归
    return my_jumpsteps(n - 1) + my_jumpsteps(n - 2);
  }
}
int main()
{
  //台阶总数
  int n = 0;
  scanf("%d", &n);
  //调用函数
  int ret = my_jumpsteps(n);
  printf("%d\n", ret);
  return 0;
}


情景变得复杂一些时,青蛙一次可跳三个台阶时


当N=1时,

此时只有一种跳法,只能跳一个台阶


当N=2时,

此时有两种跳法,一次跳两个台阶或者跳两次一个台阶。

跳法总数:2


当N=3时,

1.先跳一个台阶,接下来就是N=2的跳法;

2.先跳两个台阶,接下来就是N=1的跳法;

3.可一次跳三个台阶

跳法总数:(N=2)+(N=1) + 1=4


当N=4时,

1.先跳一个台阶,接着就是N=3的跳法;

2.先跳两个台阶,接着就是N=2的跳法;

3.先跳三个台阶,接着就是N=1的跳法;

跳法总数:(N=3)+(N=2)+(N=1)


当N=5时

1.先跳一个台阶,接着就是N=4的跳法;

2.先跳两个台阶,接着就是N=3的跳法;

3.先跳三个台阶,接着就是N=2的跳法;

跳法总数:(N=4)+(N=3)+(N=2);



以此类推

当N=n时

1.先跳一个台阶,接着就是N=n-1的跳法;

2.先跳两个台阶,接着就是N=n-2的跳法;

3.先跳三个台阶,接着就是N=n-3的跳法;

跳法总数:(N=n-1)+(N=n-2)+(N=n-3)

#include<stdio.h>
int my_jumpsteps(int n)
{
  //先进行台阶数的判断
  if (1 == n)
  {
    return 1;
  }
  if (2 == n)
  {
    return 2;
  }
  if (3 == n)
  {
    return 4;
  }
  if (n > 3)
  {
    //进行递归
    return my_jumpsteps(n - 1) + my_jumpsteps(n - 2) + my_jumpsteps(n - 3);
  }
}
int main()
{
  //台阶总数
  int n = 0;
  scanf("%d", &n);
  //调用函数
  int ret = my_jumpsteps(n);
  printf("%d\n", ret);
  return 0;
}


情景更加复杂时

青蛙一次可跳m个台阶

当N=1时,

此时只有一种跳法,只能跳一个台阶


当N=2时,

此时有两种跳法,一次跳两个台阶或者跳两次一个台阶。

跳法总数:2


当N=3时,

1.先跳一个台阶,接下来就是N=2的跳法;

2.先跳两个台阶,接下来就是N=1的跳法;

3.可一次跳三个台阶

跳法总数:(N=2)+(N=1) + 1=4


当N=4时,

1.先跳一个台阶,接着就是N=3的跳法;

2.先跳两个台阶,接着就是N=2的跳法;

3.先跳三个台阶,接着就是N=1的跳法;

4.可一次跳四个台阶

跳法总数:(N=3)+(N=2)+(N=1)+1



当N=m+1时

跳法总数:(N=m)+(N=m-1)…+(N=1)



当N=n时

跳法总数:(N=n-1)+(N=n-2)+…+(N=n-m)


#include<stdio.h>
int my_jumpsteps(int n)
{
  //先进行台阶数的判断
  if (1 == n)
  {
  return 1;
  }
  if (2 == n)
  {
  return 2;
  }
  .......
  if (n > k)
  {
  //进行递归
  return my_jumpsteps(n - 1) + my_jumpsteps(n - 2) + my_jumpsteps(n - 3) + .... + my_jumpsteps(n - k);
  }
}
int main()
{
  //台阶总数
  int n = 0;
  scanf("%d", &n);
  //调用函数
  int ret = my_jumpsteps(n);
  printf("%d\n", ret);
  return 0;
}

相关文章
|
11月前
|
C语言递归问题【青蛙跳台阶】和【汉诺塔】
C语言递归问题【青蛙跳台阶】和【汉诺塔】
|
10月前
|
【洛谷 P1464】Function 题解(递归+记忆化搜索)
该题目定义了一个递归函数$w(a,b,c)$,具有特定的终止条件和递归规则。当$a, b, c$任一值小于等于0或大于20时,函数有特殊返回值。否则,根据$a, b, c$的相对大小关系应用不同的递归计算。给定输入是一系列的三元组$(a, b, c)$,以$-1,-1,-1$结束。程序使用记忆化搜索优化递归调用,避免重复计算。样例输入输出展示了如何计算$w(1, 1, 1)$和$w(2, 2, 2)$。
95 0
青蛙跳台阶问题的简单实现与理解(递归实现)
青蛙跳台阶问题的简单实现与理解(递归实现)
|
11月前
一道递归笔试题
一道递归笔试题
44 0
汉诺塔+小青蛙跳台阶---《递归》
汉诺塔+小青蛙跳台阶---《递归》
138 0
C语言解决青蛙跳台阶问题(递归与非递归)
一只青蛙可以一次跳1级台阶或一次跳2级台阶,例如:跳上第一级台阶只有一种跳法:直接跳1级即可。跳上两级台阶,有两种跳法:每次跳1级,跳两次;或者一次跳2级.问要跳上第级台阶有多少种跳法?
181 0
你是真的“C”——函数递归详解青蛙跳台阶
手把手教学——函数递归详解汉诺塔+青蛙跳台阶问题
129 0
你是真的“C”——函数递归详解青蛙跳台阶
【C】青蛙跳台阶和汉诺塔问题(递归)
【C】青蛙跳台阶和汉诺塔问题(递归)
185 0
【C】青蛙跳台阶和汉诺塔问题(递归)