当前位置: 首页 > article >正文

汉诺塔问题和青蛙跳台阶问题(c语言)

 

285b9f52d76e44c4a4d7c3838a19ab5d.png

这俩道题都是利用到了函数递归的思想,其中汉诺塔问题较难理解,青蛙跳台阶则较简单

汉诺塔问题

题述:

设有三根柱子分别时A,B,C,在A柱子上放着n个盘子,每个盘子大小不一样,从下往上盘子大小依次减小,要求将A柱子上的盘子移动到C柱,且不改变盘子顺序(由大往小排序)。

规则:

1.一次只能移动一个盘子

2.盘子可以放在任意一个柱子上

3.盘子由大到小排序

 

图解:当n=2时,

移动顺序:A->B,A->C,B->C

b335b820c15b4811a0904f98eb6d9295.png

当n=3时

A->C,A->B,C->B,A->C,B->A,B->C,A->C

f25b778770d34347882010eb9421a5ba.png

 

思路:可以用函数递归来解决汉诺塔问题

代码插入

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void move(char pos1, char pos2)
{
	printf(" %c->%c ", pos1, pos2);

}
//n是汉诺塔的层数
//pos1起始位置
//pos2中转位置
//pos3目的位置

void Hanoi(int n,char pos1,char pos2,char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
		//这个move(pos1,pos3)对应的Hanoi中的pos1,pos3
	}
	else
	{
		//将n-1杆子上的东西从A经过中转杆C移动到B上
		Hanoi(n - 1, pos1, pos3,pos2);
		//将A上的东西移动到C上
		move(pos1, pos3);
		//将B杆子上的东西通过中转杆A移动到C上。
		Hanoi(n - 1, pos2, pos1, pos3);
	}

}

int main()
{
	/*Hanoi(2, 'A', 'B', 'C');
	printf("\n");
	Hanoi(2, 'A', 'B', 'C');
	printf("\n");*/
	Hanoi(3, 'A', 'B', 'C');
	printf("\n");
	return 0;

}

函数递归图

n==2时的

c677fd2c5511456db340e4c5cf50ab17.png

注意:

上面的,Hanoi(1,A,C,B)和Hanoi(1,B,A,

C)都是这个分支👇

c9ae11fa78db47e1ae224f36799ab7af.png

它是代码执行顺序执行的(仔细理解)

代码执行流程👇

先进入

aedc53d4ea1a40199249c46a0b3179c9.png

然后进行函数调用

349d0c5a6bd9470ebea45a10ba0ad18c.png

此时pos1=A,pos2=B,pos3=C

然后进入else内部

7d9ac43cfed7479cb0a2ad527cd509f3.png

此时Hanoi(1,A,C,B)

然后这个函数进行函数调用,此时

Hanoi(1,A,B,C),此时n==1,进入if语句里头

所以move(A->B)

这个函数Hanoi(1,A,C,B)用完后,往下进行

2757f224fb0c46bd9a5ee42a2aaab053.png

然后move(A->B)

然后进入到3f45f11e3aed46d49e680e7901967e31.png

上面的代码执行完,并没有改变n的值,所以n依旧==2

此时Hanoi(1,B,A,C)

n==1进入if语句中

然后move(B->C).

然后程序结束

运行结果

62b8ec7b707f4fb990d6f5fdfbfecc66.png


n==3时,函数递归图

4ac5cc7287a34750845ae7474d469c1e.png

a9b26512fc034f92a5aeb67fccc7f434.png

圈1代表着这个函数调用后的结果👇

85a5a276df764bfc89a48cb1e52eb1ac.png

中间的move到了这个代码行

51da7a306cd14d58a6e460fd34dc4f91.png

圈2是这个函数调用后的结果👇

fb31d15a889a4da5bbf8a0ade1418974.png

然后得到程序结果

 


青蛙跳台阶问题

题述:

有一只青蛙跳台阶,一次可以跳1次,也可以跳2次,问跳到了第n个台阶,可以有多少种跳法

思路:这道题与斐波那契求解差不多

n==1时,way==1

n==2时,way==2

n==3时,way==3

n==4时,way==5

此时即可找到规律,

当n>2时

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

那么这道题就是一个典型的函数递归问题

int Way(n)
{
	if (n == 1 )
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}
	else
		return Way(n - 1) + Way(n - 2);
}

int main()
{

	int n = 0;
	scanf("%d", &n);
	int result = Way(n);
	printf("%d", result);

	return 0;
}

程序运行

7c6d2039340f4a0698568c34f24153e8.png

 

结语:限于水平,本篇文章不足之处在所难免,若大家发现问题,大家可以指正下

 

b38990b0d38f4c77be28a9e25492561e.png

 

 

 

 

 

 


http://www.kler.cn/news/360505.html

相关文章:

  • 【MySQL】 表的增删操作
  • mysql5.7.30绿色版安装
  • 无极低码课程【mysql windows下安装要点】
  • git 与 github 同步
  • 简历修订与求职经历 - Chap04
  • Android Framework AMS(06)startActivity分析-3(补充:onPause和onStop相关流程解读)
  • 深度解析机器学习的四大核心功能:分类、回归、聚类与降维
  • 025_net基于.NET的小型超市商品管理系统2024_m28u50w3
  • 【数据分析+深度学习算法】基于深度学习音乐数据分析可视化推荐系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
  • LeetCode 面试经典150题 219.存在重复元素II
  • jetson nano ubuntu20.04安装ros-Noetic
  • 2024.10.19小米笔试题解
  • 第九课 Vue中的v-bind指令拓展
  • FLINK SQL性能调优
  • pytest框架的allure报告怎么去看
  • C++ —— set系列的使用
  • 【SQL】SQL用户管理和权限
  • 【Isaac sim】传感器设置
  • 免费申请 DV ssl证书并自动续约,非国内云厂商版本
  • C语言 | Leetcode C语言题解之第493题翻转对