首页 > 其他分享 >递归汉诺塔

递归汉诺塔

时间:2023-04-06 23:02:18浏览次数:33  
标签:递归 int move char 汉诺塔 金片 移动

题目描述

法国数学家爱德华 · 卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的 n 片金片。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。而我们现在想知道,移动这 n 片金片,需要多少步。

给这三个宝石针分别标号为 A B C , 初始状态下所有的金片都在 A 上,目的是将 A 上的所有金片移动到 C 上。

编程设计算法,输出每一步的搬运过程。

输入格式

包含一个整数,表示金片的个数。

输出格式

输出多行,每行表示搬运一个金片的详细过程。

例如: 1 A C 。 表示将编号为 1 的金片直接从 A 移到 C(编号从1开始)

# include <stdio.h>

int move(int n, char x, char y, char z)
{
if (n == 1)
printf("%d %c %c\n", n, x, z);
else
{
move(n - 1, x, z, y);
printf("%d %c %c\n", n, x, z);
move(n - 1, y, x, z);
}
return 0;
}
int main()
{
int n;
scanf("%d", &n);
move(n, 'A', 'B', 'C');
return 0;
}

标签:递归,int,move,char,汉诺塔,金片,移动
From: https://www.cnblogs.com/crocodile1006/p/17294548.html

相关文章

  • 两两交换节点位置:递归法、迭代法和数组转换法
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=......
  • 函数的递归
    递归:程序调用自身的编程技巧叫递归。最简单的递归:#include<stdio.h>intmain(){ printf("haha\n"); main(); return0;}注意:会栈溢出。栈区:储存局部变量、函数形参。堆区:储存动态开辟的内存,比如:malloc、calloc。静态区:储存全局变量、static修饰的变量。两个必要条件:1,存在限......
  • 递归与回溯_正则问题()|x
    acwing1225正则问题(递归回溯)考虑一种简单的正则表达式:只由x()|组成的正则表达式。小明想求出这个正则表达式能接受的最长字符串的长度。例如((xx|xxx)x|(x|xx))xx能接受的最长字符串是:xxxxxx,长度是6。思路:遇到'(''|'就进行递归,遇到')'就进行回溯,每次递归dfs(......
  • 汉诺塔与二进制、满二叉树的千丝万缕
    汉诺塔(TowerofHanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。汉诺塔递归算法3......
  • js 递归遍历树形结构数据,返回新的数组
    工作中,我们经常会遇到这样的情况:后端返回的数组,只需要取name、value生成新的数组,或者是将某个属性名修改,生成新的数组。递归是一种常见的解决问题的方法,即把问题逐渐简单化。“递归”的基本思想是:自己调用自己。实例如下handleDg(arrs,that){arrs.map((item,index)......
  • 【递归 WITH】递归查询树结构数据
    递归语句WITHtempTable(ID)AS(SELECTIDFROMsys_menuWHEREID='05161001'ANDDEL_STATUS=1UNIONALLSELECTm.IDFROMsys_menumJOINtempTableONm.PARENT_ID=tempTable.IDANDDEL_STATUS=1)SELECT*FROMtempTable;比如菜单树,拿到某个菜单,要查询它下......
  • 二叉树的前中后序遍历(非递归)
    classTreeNode{public:intval;TreeNode*left;TreeNode*right;TreeNode():val(NULL),left(nullptr),right(nullptr){}TreeNode(intx):val(x),left(nullptr),right(nullptr){}};classSolution{public:vector<int>preorderTra......
  • 递归算法
    递归算法 递归算法是一种通过调用自身来解决问题的算法。递归算法通常涉及到将一个问题划分为较小的子问题来解决,并在子问题中调用自身来完成。递归算法的基本思想是,将一个大问题转化为一个或多个相同结构的小问题,直到问题变得足够小以便直接解决。然后将这些小问题的解组合成......
  • 递归实现排列型枚举
    #include<iostream>usingnamespacestd;constintN=10;intn;intstate[N];boolused[N];voiddfs(intu){if(u==n+1){for(inti=1;i<=n;i++){cout<<state[i]<<"";}cout<<end......
  • 递归相关题
    遵循四个原则,1)程序执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)2)函数的局部变量是独立的,不会相互影响3)递归必须向退出递归的条件逼近,否则就是无限递归,死龟了:)4)当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁。斐波那契数列请使......