C语言解决青蛙跳台阶问题(递归与非递归)

简介: 一只青蛙可以一次跳1级台阶或一次跳2级台阶,例如:跳上第一级台阶只有一种跳法:直接跳1级即可。跳上两级台阶,有两种跳法:每次跳1级,跳两次;或者一次跳2级.问要跳上第级台阶有多少种跳法?

青蛙跳台阶问题

题目描述

问题分析

递归解法

非递归解法

题目描述


一只青蛙可以一次跳1级台阶或一次跳2级台阶,例如:跳上第一级台阶只有一种跳法:直接跳1级即可。跳上两级台阶,有两种跳法:每次跳1级,跳两次;或者一次跳2级.问要跳上第级台阶有多少种跳法?


问题分析


有一个台阶时:青蛙只能一级台阶,跳法一种


93e000765127487cacddcef0c6977c83.png

有2个台阶时:青蛙可以一次跳2级台阶,也可以跳2次一级台阶,所以跳法两种:

fcde734ef6c741b9aa6847aedf654a1e.png


当有三级台阶时,如果青蛙第一次跳一级台阶,那么之后它就有两级台阶需要跳;如果第一次跳2级台阶,那么那之后就有1级台阶需要跳。这就把问题抛到了跳一级台阶和跳两级台阶的问题上,所以有3种跳法


第一次跳1级:



559b2f05e84e474e9d4b57dc86200a15.png


第一次跳2级:




c2ba9d4761364567af597792adad1ba0.png


所以,当有n级台阶时,就可以把问题抛到n-1级台阶和n-2级台阶问题中,而这两个问题还可以细分,所以我们自然而然容易想到递归

第一次跳1级:


5f9e113144224ea6ab2de48743db6f76.png



第一次跳2级:

f8d809acf60140a99633e69d6324a56c.png





设跳n级台阶跳法为f(n)次

n = 1时,f(n) = 1;

n = 2时,f(n) = 2;

n>=3时,f(n) = f(n-1)+f(n-2);


递归解法

代码:


#include <stdio.h>
int times(int n)
{
  if (n == 1)
  {
  return 1;
  }
  else if (n ==2)
  {
  return 2;
  }
  else
  {
  return times(n - 1) + times(n - 2);
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int time = times(n);
  printf("跳%d个台阶,需要%d次\n", n, time);
  return 0;
}



非递归解法

在前面的分析可以发现,n>=3时,f(n) = f(n-1)+f(n-2),也就是前n阶的前两种情况

所以完全可以使用非递归的循环语句解决这个问题


int times2(int n)
{
  if (n == 1)
  {
  return 1;
  }
  if (n == 2)
  {
  return 2;
  }
  else
  {
  int a = 1;   //一阶台阶有1中跳法
  int b = 2;   //二阶台阶有2种跳法
  int c = 0;  
  while (n > 2)
  {
    c = a + b;  
    a = b;
    b = c;
    n--;
  }
  return c;
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int time2 = times2(n);
  printf("跳%d个台阶,需要%d次\n", n, time2);
  return 0;
}



这里用动图解释过程

07f26a2ee6af4afe8a298bceb4f219ae.gif

全部代码


#include <stdio.h>
int times(int n)
{
  if (n == 1)
  {
  return 1;
  }
  else if (n ==2)
  {
  return 2;
  }
  else
  {
  return times(n - 1) + times(n - 2);
  }
}
int times2(int n)
{
  if (n == 1)
  {
  return 1;
  }
  if (n == 2)
  {
  return 2;
  }
  else
  {
  int a = 1;
  int b = 2;
  int c = 0;
  while (n > 2)
  {
    c = a + b;
    a = b;
    b = c;
    n--;
  }
  return c;
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int time = times(n);
  printf("递归:跳%d个台阶,需要%d次\n", n, time); 
  int time2 = times2(n);
  printf("非递归:跳%d个台阶,需要%d次\n", n, time2);
  return 0;
}


测试结果:

——————————————8293b0cade2c450cb73bd94791d91a1a.png

目录
相关文章
|
1月前
|
存储 编译器 C语言
爱上C语言:函数递归,青蛙跳台阶图文详解
爱上C语言:函数递归,青蛙跳台阶图文详解
|
7天前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
9 0
|
18天前
|
机器学习/深度学习 C语言
函数递归深入解析(C语言)
函数递归深入解析(C语言)
|
21天前
|
C语言 索引
c语言的函数与递归
c语言的函数与递归
15 1
|
1月前
|
搜索推荐 C语言 C++
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
|
1月前
|
C语言 索引
【C语言】C语言⻘蛙跳台阶问题--递归问题
【C语言】C语言⻘蛙跳台阶问题--递归问题
|
18天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
4天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
11 2
|
12天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
15天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)