汉诺塔问题(Hanoi) C语言与Python实现

11 篇文章 0 订阅

上 题目与分析:

  • 截取自C语言书籍中,详细的题目描述及解题分析
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

C语言实现:

  • 尝试过自己解题,但是始终还是琢磨的不是很到位。
  • 总结一下主要是有两点
  • (1) 去发现规律,想着去用递归,然后如何代码实现递归
  • (2) 其中 叙述的 A B C,三个塔, 有两个过程, (1)A 借助 B 向 C ,(2) B 借助 A 向 C。 都可以抽象为 一个借助 另一个,向 另另一个三者的关系~ 这也将两种情况抽象的实现为一种,一个函数解决,我没想到这样
下面是书中的解题代码
// 汉诺塔问题
#include<stdio.h>

int main()
{
	void hanoi(int n, char one, char tow, char three);
	int m;
	printf("请输入要移动的盘子数目\n");
	scanf("%d", &m);
	printf("这是移动盘子的步骤:\n");
	hanoi(m, 'A', 'B', 'C');

	return 0;
}

// 实现将 one 借助 tow 转移到 three
void hanoi(int n, char one, char tow, char three)
{
	void move(char c1, char c2);
	// 当只有一个盘子的时候
	if(n == 1)
	{
		move(one , three);
	}
	else
	{
		//递归
		//1. n-1 个盘子,移动到 B, 此时: A 借助 C 向 B 移动
		hanoi(n-1, one, three, tow);
		//2. n个盘子还剩最下面一个,就直接放到C, 此时: A直接放到C
		move(one, three);
		//3. 再将 n-1个移动到B的盘子 移动到 C, 此时 B 借助 A 向 C移动
		hanoi(n-1, tow, one, three);

	}
}

// 用这个函数输出移动的步骤
void move(char c1, char c2)
{
	printf("%c-->%c\n",c1,c2);
}
  • 之前做过简单的 递归,这个出奇并 扩展思维的是, else 里面多次 调用 自身三个步骤完成一次目的。这与想象的 单个调用复杂一点。

Python实现

  • 同样Python并没有新方法,也是按照上面的逻辑,改写成 Python代码
x = int(input("请输出盘子的数量"))

def hanoi(n, one, tow, three):
    if n == 1:
        move(one, three)
    else:
        hanoi(n-1, one, three, tow)
        move(one, three)
        hanoi(n-1, tow, one , three)

def move(c1, c2):
    print("%c-->%c" % (c1, c2))

hanoi(x, 'A', 'B', 'C')

总体来说这个题目给我的收获蛮大。 第一个了解函数的作用,在一个 函数的递归解决问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值