C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现

发布时间:2021-09-14 21:10:25 作者:chen
来源:亿速云 阅读:169

这篇文章主要介绍“C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现”,在日常操作中,相信很多人在C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录

一、青蛙跳台阶

题目

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法

思路

遇见题目我们可以在纸上先动手画画,把最简单的几种方式列出来,作比较,找规律。


C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现

分析

按照上面表格可以从跳法次数,过程,或者两者结合找规律

1. 从跳法次数分析

代码1(递归)

#include <stdio.h>
int jump(int n)
{
 if (n == 1)
  return 1;
 if (n == 2)
  return 2;
 return jump(n - 1) + jump(n - 2);
}
int main()
{
 int n;
 scanf("%d", &n);
 int ret = jump(n);
 printf("%d", ret);
 return 0;
}
2. 从过程分析

代码2(非递归)

#include <stdio.h>
int fac(int m)
{
 int i = 0;
 int count = 1;
 for (i = 1; i <= m; i++)
 {
  count *= i;
 }
 return count;
}
int jump(int n)
{
 int i = 0;      //i为跳两阶台阶的次数
 int sum = 0;     //sum为计算跳法
 for (i = 0; i <= n / 2; i++)
 {
  int a = 0;
  a = n - i * 2 + i;   //a为跳到n阶台阶跳的次数 
  sum += fac(a) / (fac(i)*fac(a - i));
 }
 return sum;
}
int main()
{
 int n;
 scanf("%d", &n);
 int ret = jump(n);
 printf("%d", ret);
 return 0;
}

二、青蛙跳台阶变式1

题目

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶…也可以跳n级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法

分析

代码3(递归)

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

三、青蛙跳台阶变式2

题目

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶…也可以跳m级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(m<=n)

分析

代码4(递归)

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

四、汉诺塔问题(求步数)

题目

有A,B,C三个柱子,A柱子上从上到下,从小到大排列着n个圆盘。现要求将A柱子上的n个圆盘全部移动到C柱子上,依然按照从上到下,从小到大的顺序排列。且对移动过程要求如下:

a)一次只能移动一个盘子。

b)移动过程中大盘子不允许出现在小盘子上方。

问:总共需要移动的步数是多少?

思路

因为求的是步数,我们可以通过找前面几组数据,观察是否有什么规律

C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现

分析

C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现

  1. 将最上面的n-1个盘子移动到B柱上

  2. 将最下面的盘子移动到C柱上

  3. 再将B柱上的n-1个盘子移动到C柱上

代码5(非递归)

#include <stdio.h>
#include <math.h>
int main()
{
 int n;
 scanf("%d", &n);
 int count =0;
    count=(int)pow(2,n)-1;
 printf("%d", count);
 return 0;
}

代码6(递归)

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

五、汉诺塔问题(求移动过程)

题目

有A,B,C三个柱子,A柱子上从上到下,从小到大排列着n个圆盘。现要求将A柱子上的n个圆盘全部移动到C柱子上,依然按照从上到下,从小到大的顺序排列。且对移动过程要求如下:

a)一次只能移动一个盘子。

b)移动过程中大盘子不允许出现在小盘子上方。

问:打印移动的方案 (例如, 移动A柱最上面的圆盘到C柱, 则输出"A -> C")

思路

因为求的是移动方案,所以我们可以将前几组数据列出来,结合递归化简为繁的思想找共性和非共性

C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现

分析

代码7(递归)

#include <stdio.h>
void hanio(int n, char x, char y, char z)
{
 if (n == 1)
  printf("%c->%c\n",x,z);  //当盘子只剩一个时,直接打印初始柱移动到目标柱的过程
 else
 {
  hanio(n - 1, x, z, y);  //将n-1个盘子从起始柱放到目标柱(第一次A->B,第二次B->A,后面往复)
        
  printf("%c->%c\n", x, z); //打印初始柱移动到目标柱的过程
        
  hanio(n - 1, y, x, z);  //将n-1个盘子从起始柱放到目标柱(第一次B->C,第二次C->B,后面往复)
 }
}
int main()
{
 int n;
 scanf("%d", &n);
 hanio(n,'A','B','C');
 return 0;
}

到此,关于“C语言经典案例青蛙跳台阶和汉诺塔问题怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. python汉诺塔
  2. 汉诺塔问题c语言实现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:C++怎么实现矩阵对称正交化

下一篇:爬虫使用代理IP请求失败了怎么办

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》