ハノイ問題(ハノイ)C言語とPythonの実装

トピックと分析:

  • C言語の本、詳細なトピックの説明、問題解決の分析から傍受
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    ここに画像の説明を挿入

C言語の実装:

  • 私は自分で問題を解決しようとしましたが、それでもうまく理解できませんでした。
  • 要約すると、2つの主要なポイントがあります
  • (1)法則を発見するには、再帰の使用を検討し、次に再帰を実現するためのコーディング方法を検討します
  • (2)そこに記述されているABCには、3つのタワーと2つのプロセスがあり、(1)AはBからCを使用し、(2)BはAからCを使用します。どちらもお互いの助けを借りてお互いの関係として抽象化することができます〜これも2つの状況を1つに抽象化し、1つの関数がそれを解決します。私はこれを期待していませんでした

以下は本の問題解決コードです

// 汉诺塔问题
#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が自分自身を複数回呼び出し、3つのステップで1回ゴール完了するというものですこれは、想像された単一の呼び出しよりも少し複雑です。

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')

全体として、このトピックは私に多くの利益をもたらしました。関数の関数を最初に理解し、関数の再帰の問題を解決します。

おすすめ

転載: blog.csdn.net/pythonstrat/article/details/112862481