news 2026/7/4 10:00:01

《经典递归问题:汉罗塔》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《经典递归问题:汉罗塔》

🌠作者:@TheMythWS.

🎇座右铭:不走心的努力都是在敷衍自己,让自己所做的选择,熠熠发光。

目录

✨汉罗塔的介绍

图解游戏​

✨N层汉罗塔需移动的次数

✨汉罗塔的代码实现

c语言实现:

运行结果:

java语言实现:

运行结果:


✨汉罗塔的介绍

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

图解游戏

✨N层汉罗塔需移动的次数

✨汉罗塔的代码实现

c语言实现:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> /* 思路1: * 将1~N层从A->B, A为源,B为目的,C作为辅助 角色在变化 * 等价于 * 1、把1~N-1层从A->C,A为源,B为辅助,C为目的 * 2、把第N层从A->B 此时没有角色变化 * 3、把1~N-1层从C->B,A为辅助,B为目的,C为源 思路2: * 将1~N层从A->C, A为源,B作为辅助,C为目的 角色在变化 * 等价于 * 1、把1~N-1层从A->B,A为源,B为目的,C为辅助 * 2、把第N层从A->C 此时没有角色变化 * 3、把1~N-1层从B->C,A为辅助,B作为源,C作为目的 */ /* 将N个盘子从source移动到target的路径的打印 N 初始的N个从小到大的盘子,N是最大编号 from 原始柱子 to 目标柱子 help 辅助的主子 */ //思路1 void printHannoiTower1(int n, char from[], char to[], char help[]) {//将1~N层从A->B, A为源,B为目的,C作为辅助 角色在变化 if (n == 1) { printf("move %d from %s to %s\n", n, from, to);//把第N层从A->B return; } else { printHannoiTower1(n - 1, from, help, to);//把1~N-1层从A->C,A为源,B为辅助,C为目的 printf("move %d from %s to %s\n", n, from, to);//N可以顺利达到target,只需要1步完成 printHannoiTower1(n - 1, help, to, from);//把1~N-1层从C->B,A为辅助,B为目的,C为源 } } //思路2 void printHannoiTower2(int n, char from[], char help[], char to[]) {//将1~N层从A->C, A为源,B作为辅助,C为目的 角色在变化 if (n==1) { printf("move %d from %s to %s\n", n, from, to);//把第N层从A->C return; } else { printHannoiTower2(n - 1, from, to, help);//把1~N-1层从A->B,A为源,B为目的,C为辅助 printf("move %d from %s to %s\n", n, from, to);//N可以顺利达到target,只需要1步完成 printHannoiTower2(n - 1, help, from, to);//把1~N-1层从B->C,A为辅助,B作为源,C作为目的 } } int main() { printHannoiTower1(3, "A", "B", "C"); printf("------------------\n"); printHannoiTower2(3, "A", "B", "C"); return 0; }

运行结果:

java语言实现:

package com.themyth.test; /** * 找重复: * 1.找到一种划分方法 * 2.找到递推公式或者等价转化 * 都是父问题转化为求解子问题 * 找变化的量: * 变化的量通常要作为参数 * 找出口: * 根据参数变化的趋势,对边界进行控制,适时终止递归 *思路1: * 将1~N层从A->B, A为源,B为目的,C作为辅助 角色在变化 * 等价于 * 1、把1~N-1层从A->C,A为源,B为辅助,C为目的 * 2、把第N层从A->B * 3、把1~N-1层从C->B,A为辅助,B为目的,C为源 * 思路2: * 将1~N层从A->C, A为源,B作为辅助,C为目的 角色在变化 * 等价于 * 1、把1~N-1层从A->B,A为源,B为目的,C为辅助 * 2、把第N层从A->C * 3、把1~N-1层从B->C,A为辅助,B作为源,C作为目的 * */ /** * 将N个盘子从source移动到target的路径的打印 * N 初始的N个从小到大的盘子,N是最大编号 from 原始柱子 to 目标柱子 help 辅助的主子 */ public class 汉诺塔 { public static void main(String[] args) { //思路1:C作为辅助 printHannoiTower1(3,"A","B","C"); System.out.println("----------------------------"); //思路2:B作为辅助 printHannoiTower2(3,"A","B","C"); } //注意角色的变化 private static void printHannoiTower1(int N, String from, String to, String help) {// from源、to目的、help辅助 if (N == 1) { System.out.println("move " + N + " from " + from + " to " + to); return; }else { printHannoiTower1(N-1,from,help,to);// 先把N-1个盘子移动到辅助空间上去,源、辅助、目的 System.out.println("move " + N + " from " + from + " to " + to);// N可以顺利达到target,只需要1步完成 printHannoiTower1(N-1,help,to,from);// 让N-1从辅助空间回到源空间上,辅助、目的、源 } } private static void printHannoiTower2(int N, String from, String help, String to) {// from源、help辅助、to目的 if (N == 1){ System.out.println("move " + N + " from " + from + " to " + to); return; }else { printHannoiTower2(N-1,from,to,help);// 先把N-1个盘子移动到辅助空间上去,源、目的、辅助 System.out.println("move " + N + " from " + from + " to " + to);// N可以顺利达到target,只需要1步完成 printHannoiTower2(N-1,help,from,to);// 让N-1从辅助空间回到源空间上,辅助、源、目的 } } }

运行结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 9:59:46

回溯题目:复原 IP 地址

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;复原 IP 地址 出处&#xff1a;93. 复原 IP 地址 难度 5 级 题目描述 要求 有效 IP 地址由恰好四个整数和分隔整数的点组成。每个整数在范围 0 \…

作者头像 李华
网站建设 2026/7/4 9:58:28

统计字符串中数字、字母、其他字符的出现次数

【问题描述】从键盘输入一个字符串&#xff0c;分别统计数字&#xff0c;字母&#xff08;包括大小写&#xff09;和其他字符的个数&#xff0c;输出每个字符及其个数。要求&#xff1a;用字典进行统计。【输入形式】输入一个随机字符串 【输出形式】输出为记录统计的结果&…

作者头像 李华
网站建设 2026/7/4 9:57:53

PowerShell 获取AD域用户属性

1、查看指定用户信息Get-ADUser -Identity zhangsan# 显示 DistinguishedName : CNzhang san,OUSHA,DCmsh,DClocal Enabled : True GivenName : zhang Name : zhang san ObjectClass : user ObjectGUID : 7aa0a36a-4e9f-48b8-87dd…

作者头像 李华
网站建设 2026/7/4 9:56:18

运算放大器的线性全波整流电路

目录&#xff1a; 1、全波整流的介绍 2、运放全波整流电路仿真 3、运放整流电路的优劣 4、运放整流应用-交流检测 5、运放整流应用-数字万用表 1、全波整流的介绍 ▼如果双极性的交流信号经过一个二极管&#xff0c;则交流信号的负半轴不能通过二极管&#xff0c;输出只有…

作者头像 李华
网站建设 2026/7/4 9:56:17

伺服控制器设计:从理论到实践的全面指南

1. 伺服控制器设计概述伺服控制器作为现代工业自动化系统的核心部件&#xff0c;其性能直接影响着整个机电系统的精度、响应速度和稳定性。一个完整的伺服控制器设计流程通常包括需求分析、方案设计、硬件选型、软件算法开发、调试优化以及最终的批量生产验证等环节。在实际工程…

作者头像 李华