汉诺塔——递归算法(c语言实现)

这篇具有很好参考价值的文章主要介绍了汉诺塔——递归算法(c语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每日一题

 文章来源地址https://www.toymoban.com/news/detail-693226.html

文章目录

 

汉诺塔 问题 :

一、递归算法

二、解决汉诺塔问题

1.找规律,确定思路

2.代码实现

总结


 

 


汉诺塔 问题 :

 

     1.有三根杆(编号A、B、C)
     2. 在A杆自下而上、由大到小按顺序放置n个金盘
     3.把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。

操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,
小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

c语言递归解决汉诺塔,算法,c#


 

提示:以下是本篇文章正文内容,下面案例可供参考

一、递归算法

递归算法是算法中很常用的一种方法,是一种逆行思维,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

大事化小,由小引大。

通俗的讲:就是找规律(类似数学归纳法)

二、解决汉诺塔问题

1.找规律,确定思路


(1)  当 n = 3 时   (详细步骤)

0.            A(1.2.3),B(),    C()

1.A->C     A(2.3),  B(),    C(1)

2.A->B     A(3),    B(2),   C(1)

3.C->B     A(3),    B(1.2), C()

4.A->C     A(),      B(1.2), C(3)

5.B->A     A(1),    B(2),    C(3)

6.B->C     A(1),    B(),      C(2.3)

7.A->C     A(),      B(),      C(1.2.3)

 

可以发现:可分为两步 1~~~4和4~~7

所以总结可得:

汉诺塔解题步骤:

第一步:

                  把 n-1 个模块从塔 1 移动到塔 2
                  把第 n 个模块从塔 1 移动到塔 3
第二步:
                  把 n-1 个模块从塔 2 移动到塔 3

 所以求 n = 4 时

如下:

c语言递归解决汉诺塔,算法,c#

 

 

2.代码实现

代码如下(示例):

 

#include <stdio.h>
int count;
void move(char A, char C, int n)
{
	printf("把第%d个圆盘从%c->%c\n", n, A, C);
	count++;
}

void Hanno(char A, char B, char C, int n)
{
	if (n == 1)
	{
		move(A, C, n);
	}
	else
	{
		//将n-1个圆盘从A柱借助于C柱移动到B柱上
		Hanno(A, C, B, n - 1);
		//将A柱子最后一个圆盘移动到C柱上
		move(A, C, n);
		//将n-1个圆盘从B柱借助于A柱移动到C柱上
		Hanno(B, A, C, n - 1);
	}
}

int main()
{
	int n = 0;
	printf("输入A柱子上的圆盘个数:");
	scanf("%d", &n);
	//将n个圆盘从A柱借助于B柱移动到C柱上
	Hanno('A', 'B', 'C', n);
	printf("一共移动了%d次圆盘",count);
	return 0;
}

运行结果 

输入A柱子上的圆盘个数:3
把第1个圆盘从A--->C
把第2个圆盘从A--->B
把第1个圆盘从C--->B
把第3个圆盘从A--->C
把第1个圆盘从B--->A
把第2个圆盘从B--->C
把第1个圆盘从A--->C
一共移动了7次圆盘
--------------------------------

 输入A柱子上的圆盘个数:4
把第1个圆盘从A--->B
把第2个圆盘从A--->C
把第1个圆盘从B--->C
把第3个圆盘从A--->B
把第1个圆盘从C--->A
把第2个圆盘从C--->B
把第1个圆盘从A--->B
把第4个圆盘从A--->C
把第1个圆盘从B--->C
把第2个圆盘从B--->A
把第1个圆盘从C--->A
把第3个圆盘从B--->C
把第1个圆盘从A--->B
把第2个圆盘从A--->C
把第1个圆盘从B--->C
一共移动了15次圆盘


总结

真的很难,自己总结一下,方便自己看也分享给各位

 

 

到了这里,关于汉诺塔——递归算法(c语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】函数递归:汉诺塔问题

    汉诺塔问题是一道经典的计算机科学中的递归算法题,通过解决汉诺塔问题以更好的理解递归。 函数递归:函数自己调用自己。 函数递归的两个必要条件: 1.函数自身的调用要有限制条件,如果没有限制条件,就会无限的自己调用自己而导致栈溢出(stack overflow)(关于栈溢

    2024年02月03日
    浏览(37)
  • 掌握Go语言:探索Go语言递归函数的高级奥秘,优化性能、实现并发、解决算法难题(28)

    递归函数在Go语言中是一种强大的工具,能够解决许多复杂的问题。除了基本的递归用法外,Go语言还提供了一些高级用法,使得递归函数更加灵活和强大。本文将深入探讨Go语言递归函数的高级用法,包括尾递归优化、并发递归和记忆化递归等。 尾递归优化 尾递归是一种特

    2024年04月10日
    浏览(50)
  • C++实现汉诺塔问题(递归实例)

    汉诺塔的由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。 印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论

    2024年02月07日
    浏览(34)
  • C# 使用递归方法实现汉诺塔步数计算

    举一个例子:计算从 1 到 x 的总和 有三个石柱,在最左侧的石柱上从小到大摆放 N 层盘片,需要从最左侧的石柱移动到最右侧的石柱上,中间的石柱作为缓冲,一次只能移动一个盘片,且无论何时较小的盘片始终在较大的盘片上面。 这个问题求解这过程中搬运的次数 创建一

    2024年02月11日
    浏览(47)
  • 斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题

    Write once,Runanywhere. 🔥🔥🔥 本派文章详细斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题。 💥 💥 💥 如果你觉得我的文章有帮助到你,还请【关注➕点赞➕收藏】,得到你们支持就是我最大的动力!!! 💥 💥 💥 ⚡ 版权声明:本文由【马上回来了】原创、

    2023年04月08日
    浏览(53)
  • C语言递归算法实现经典例题

    递归是一种编程技术,它通过在函数内部反复调用自身来解决问题。当一个程序调用自己时,这就称为递归调用。递归可以有助于简化某些算法的实现和理解。在递归过程中,每个调用都会将一些数据保存在栈上,直到递归结束后才能被处理并弹出栈。 递归通常有两个部分:

    2024年02月05日
    浏览(54)
  • 二叉树中序遍历非递归算法C语言实现

    // //  Inordertraverse.c //  二叉树链式存储 // //  Created by 丘** on 2021/7/28. // #include \\\"Inordertraverse.h\\\" #include stdbool.h #includestdlib.h typedef   struct StackNode {     int data;     struct StackNode* next;      }StackNode; typedef struct BiTNode {     int data;     struct BiTNode* lchild,* rchild;           }BiTnode

    2024年02月02日
    浏览(36)
  • 使用迭代方式解决汉诺塔问题(Java语言)

    目录 汉诺塔问题解决 迭代介绍         在这个Java示例中,我们使用了一个 Stack 数据结构来模拟递归调用的过程。 hanoiIterative 函数接受盘子数量 n 以及三个柱子的名称作为参数,并在迭代过程中模拟汉诺塔的移动操作。 moveDisk 函数用于模拟盘子的移动操作。        

    2024年02月09日
    浏览(49)
  • 汉诺塔+小青蛙跳台阶---《递归》

    目录 前言: 1.汉诺塔: 1.1分析盘子数从1-3的情况 1.2盘子移动的规律总结 2.青蛙跳台阶: 2.1跳一个台阶或跳两个台阶 2.2扩展 ❤博主CSDN:啊苏要学习   ▶专栏分类:C语言◀   C语言的学习,是为我们今后学习其它语言打好基础,C生万物!   开始我们的C语言之旅吧!✈   在学

    2024年02月03日
    浏览(37)
  • 递归求解汉诺塔问题(超详解)

    这个问题是关于三根柱子和一些圆盘的游戏。 初始时,所有的圆盘按照从大到小的顺序叠放在一根柱子上,目标是将所有圆盘从起始柱子移动到目标柱子上,在移动过程中,要满足以下规则喵: 每次只能移动一个圆盘。 大圆盘不能放在小圆盘上。 只能通过中间柱子作为辅

    2024年02月15日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包