首页 > 其他分享 >C语言函数递归经典题型——汉诺塔问题

C语言函数递归经典题型——汉诺塔问题

时间:2024-11-26 23:01:36浏览次数:7  
标签:count 题型 博客 C语言 汉诺塔 CSDN 盘子 移动

一.汉诺塔问题介绍

        Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动一盘子的步骤。

二.解题思路

把A B C分成 起始座 中间座 目标座

        我们先分析两个盘子情况:

(先将上面的移到B,再把下面的移到C,最后把B处的移到C)

        我们再来分析三个盘子情况:

{  首先把这三个盘子分为两部分:最底下的大盘子和上面所有小盘子,然后我们根据两个盘子的情况,考虑先把上面所有小盘子移动到B,把大盘子移动到C,最后把所有小盘子移动到C,而把上面所有小盘子移动到B的步骤和上面我们刚分析的移动两个盘子的情况类似,(只是移动到B而不是C的区别),此时我们可以把C看成中间座,把B看成目标座(也就是说在三个盘子情况下又嵌套一个两个盘子的汉诺塔问题),当把上面所有小盘子移动到B的时候(第⑤步),我们需要把所有小盘子借助A移动到C,此时A看成中间座,C看成目标座,移动方法和上面分析的两个盘子移动情况类似(又嵌套一个两个盘子的汉诺塔问题),此时函数递归的“影子”逐渐清晰。 }

        上面的文字很关键,通过比较两个和三个盘子的步骤找到函数递归的身影!!!

        当盘子个数增加的时候,规律还是一样。

        下面我们通过代码把这个问题解决

代码如下:

#include <stdio.h>
void move(char A, char B)
{
	printf("%c -> %c\n", A, B);
}
void hanoi(int n, char A, char B, char C,int *count)
{
	(*count)++;
	if (n == 1)
	{
		move(A, C);
	}
	else
	{
		hanoi(n - 1, A, C, B,count);
		move(A, C);
		hanoi(n - 1, B, A, C,count);
	}
}
int main()
{
	int count = 0;
	int n=0;
	printf("请输入盘子总数:");
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C',&count);
	printf("需要移动总次数%d",count);
	return 0;
}

运行结果:

代码解读:

①使用了move,hanoi函数,并且利用count求需要移动的次数。

②在使用count求传递次数的时候,要调用count的地址,进行函数的传址调用(因为要修改主函数count的值)。(传值传址调用在函数基本知识(一)中有详细的讲解)。

本期汉诺塔问题就分析到这里~~~

往期回顾:

C语言——数组基本知识(二)-CSDN博客

C语言——数组基本知识(一)-CSDN博客

C语言——数组逐元素操作练习-CSDN博客

C语言编程练习:验证哥德巴赫猜想 进制转换 rand函数-CSDN博客

C语言——函数基本知识(三)-CSDN博客

C语言——函数基本知识(二)-CSDN博客

C语言 ——函数基本知识(一)-CSDN博客

C语言穷举法算法经典题型(二)_编写程序,输入x,输出y y= x2+3x-4 (x≤5) =x2-5x+7 (x>5) 输入 一个-CSDN博客

C语言穷举法算法经典题型(一)_c语言穷举法经典例题-CSDN博客

标签:count,题型,博客,C语言,汉诺塔,CSDN,盘子,移动
From: https://blog.csdn.net/hjx1235/article/details/144066732

相关文章

  • C语言(七)----指针(下)
    深入理解指针(4)字符指针变量#include<stdio.h>intmain(){ charch='h'; char*pch=&ch; printf("%c\n",*pch); *pch='g'; printf("%c\n",*pch); return0;}//结果为://h//g//也可以:#include<stdio.h>int......
  • 学习分享-队列-1(数据结构C语言)
    本章写的是基于链表的队列,通过链表来实现队列的操作一个基于链表的队列(Queue)数据结构,先进先出结构体定义typedefstructNode{intdata;structNode*next;structNode*pre;}Node;定义一个节点(Node)结构体,包含数据(data)、指向下一个节点的指针(next)和指向......
  • C语言学习笔记(持续更新)
    C语言计算机的组成(预备知识)计算机组成计算机:能进行计算和逻辑的设备硬件:组成计算机的各种物理部件(鼠标,键盘)【硬件=电子设备+单片机编程+集成电路+嵌入式系统】软件:计算机中运行的程序和数据【软件=系统软件+应用软件+编程语言+算法和数据结构】计算机的六大部件中......
  • C语言(数据,运算符)
    C语言学习笔记2——数据,运算符变量概念在程序执行过程中其中的值可以被改变的量变量代表内存中具有特定属性的一个存储单元,他是用来存储数据的,也就是存变量的值变量应有个名字,以便于通过名字访问变量举例:#include<stdio.h>intmain(){ //①声明变量并初始化 i......
  • 学习分享-队列-2(数据结构C语言)
    本章通过C++代码使用STL(标准模板库)中的queue类实现了栈的基本操作,包括入队、出队、查看队头元素、判断队列是否为空以及清空队列。导入头文件#include<iostream>#include<queue>//引入队列的头文件usingnamespacestd;创建队列queue<int>q;入队操作q.push(10)......
  • 2024届新题型数学模拟选题
    目录#12024九省联考#2浙江省L16联盟2024年高三返校适应性测试#12024九省联考题型题号代数10,11,14几何8,18#2浙江省L16联盟2024年高三返校适应性测试题型题号代数8,9,11,19(1)几何16(1)(ii)......
  • C语言 - 函数(二)
    1.函数的嵌套调用和链式访问函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。1.1嵌套调用你写的函数我可以用,我写的函数你可以用,这个叫做嵌套调用。但是不可以嵌套定义intAdd(intx,inty){ returnx+y;}intSub(intx,inty){ returnx-y;}......
  • 【C语言】前端项目故障处理。
    在前端项目中,如何处理错误和异常的? 在前端项目中,处理错误和异常通常涉及以下几个步骤: 捕获错误:JavaScript提供try...catch语句用于捕获运行时可能出现的错误。将可能会出错的代码放在try块内,如果发生错误,程序会立即跳转到相应的catch块,其中可以处理错误。     ......
  • 程序设计C语言(输出素数)
    //输出100~200之间的素数intmain(void){intnum,i;for(num=100;num<=200;num++){for(i=2;i<num;i++){if(num%i==0){break;}if(i==num-1){printf("%d\n",nu......
  • 深入理解指针(C语言)
    本文目录引言概要正文一指针的类型(1)内置数据类型指针(2)数组指针与指向数组的指针(3)函数指针(4)结构体指针与联合体指针(5)空指针(void*)(6)指针的指针(7)常量指针与指向常量的指针二指针的步长三指针的解引用四指针运算(1)常见的指针运算(2)指针运算的注意事项指针的应用(1)数组处......