【C语言】青蛙跳台阶 —— 详解

简介: 【C语言】青蛙跳台阶 —— 详解


一、问题描述

LCR 127. 跳跃训练 - 力扣(LeetCode)


二、解题思路

1、当 n = 1 时,一共只有一级台阶,那么显然青蛙这时就只有一种跳法


2、当 n = 2 时,一共有两级台阶,这时青蛙的跳法有两种


以此类推,通过这种思路来求解。该题要求的是青蛙从 0 ~ n 级台阶的所有跳法,我们可以假设跳上 n 级台阶一共有 f(n) 种跳法。从上面的图片我们可以知道青蛙的最后一步的跳法只有两种情况: 跳上 1 级或 2 级台阶。那就意味着如果青蛙选择跳 1 级台阶的跳法将与选择跳 2 级台阶时不相同:

  • 当跳上 1 级台阶时: 还剩 n-1 个台阶,此情况共有 f(n-1) 种跳法;
  • 当跳上 2 级台阶时: 还剩 n-2 个台阶,此情况共有 f(n-2) 种跳法。

可以得到 f(n) = f(n-1) + f(n-2) 。由此就可以不断递归下去,这斐波那契数列的解题思路有异曲同工之处,唯一的不同在于起始数字不同。

  • 青蛙跳台阶问题:f(0) = 1,f(1) = 1,f(2) = 2;
  • 斐波那契数列问题:f(0)=0,f(1) = 1,f(2) = 1。


三、代码

#include <stdio.h>
 
// 求n台阶青蛙的跳法
int frog_jump_step(int n)
{
  // 对特殊情况作处理
  if (n == 1)
  {
    return 1;
  }
  if (n == 2)
  {
    return 2;
  }
  // 递归调用
  return frog_jump_step(n - 1) + frog_jump_step(n - 2);
}
int main()
{
  int n = 0;
  scanf("%d", &n);
 
  int ways = frog_jump_step(n);
  printf("%d\n", ways);
 
  return 0;
}

四、扩展


1、解题思路

(1)思路一

这里的青蛙比上面的青蛙更厉害一些,它一次可以跳 1 阶,2阶,3阶... ....。所以如果想要跳到第 n 个台阶,我们可以从第 1 个台阶跳上来,也可以从第 2 个台阶跳上来... ...,所以递推公式是:f(n) = f(n-1) + f(n-2) + ... ... + f(2) + f(1);

同样在跳到第 n-1 个台阶时,也可以列出下面这个公式:

f(n-1) = f(n-2) + ... ... + f(2) + f(1);

通过上面两个公式相减我们可以得到:f(n) = 2 * f(n-1)


(2)思路二

当然这里也可以用非递归的方式来实现:

f(1) = 1 = 2⁰

f(2) = 1 + f(1) = 2 = 2¹

f(3) = 1 + f(2) + f(1) = 4 = 2²

f(4) = 1 + f(3) + f(2) + f(1) = 8 = 2³

...

f(n) = 2⁽ⁿ⁻¹⁾

这里可以使用函数 pow(2,n -1),要记得加上头文件 <math.h>。也可以用 << 来表示。


2、代码

#include<stdio.h>
 
int frog_jump_step(int n)
{
  if (n == 1)
  {
    return 1;
  }
  return 2 * frog_jump_step(n - 1);
}
 
int main()
{
  int n = 0;
  scanf("%d", &n);
 
  int way = frog_jump_step(n);
  printf("%d\n", way);
 
  return 0;
}
 
int frog_jump_step(int n)
{
    if (n == 1)
    {
        return 1;
    }
    return 1 << (n-1);
}
 
int main()
{
    int n = 0;
    scanf("%d", &n);
 
    int way = frog_jump_step(n);
    printf("%d\n", way);
 
    return 0;
}


相关文章
|
7月前
|
存储 编译器 C语言
爱上C语言:函数递归,青蛙跳台阶图文详解
爱上C语言:函数递归,青蛙跳台阶图文详解
|
C语言
【C语言刷题】青蛙跳台阶
【C语言刷题】青蛙跳台阶
142 1
|
C语言
【C语言实现青蛙跳台阶问题】
【C语言实现青蛙跳台阶问题】
46 0
|
7月前
|
C语言
C语言递归问题【青蛙跳台阶】和【汉诺塔】
C语言递归问题【青蛙跳台阶】和【汉诺塔】
|
6月前
|
算法 C语言
C语言实现青蛙跳台阶问题
C语言实现青蛙跳台阶问题
68 5
|
7月前
|
C语言 索引
【C语言】C语言⻘蛙跳台阶问题--递归问题
【C语言】C语言⻘蛙跳台阶问题--递归问题
|
C语言
【C语言】青蛙跳台阶(两种青蛙跳)
【C语言】青蛙跳台阶(两种青蛙跳)
153 0
|
24天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
48 10
|
24天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
43 9
|
24天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
33 8