C ++学習記録-単純な再帰呼び出しの例


アイデア :再帰は、主に一種の「モックドール」に似た問題を解決します。同じ法則で複雑な問題を減らすことができ、最終的に既知の状況がある場合、再帰を考慮することができます。
たとえば、ハノイの塔は層ごとに減少しています。プレートの数が最終的に1に減少した場合、中間位置を通過せずに、プレートを初期位置から目標位置に移動するだけで済みます。

1.ハノイの塔

重要なのは、再帰の終わりには明確な結果があり、無限の「モックドール」ではないということです。

#include <iostream>
using namespace std;

int m;		//计数

void move(char src, char goal)
{
    
    
	cout << src << " -> " << goal << endl;
	m += 1;
}

void hanio(int n, char src='A', char middle='B', char goal='C')
{
    
    
	if (n == 1)		//递归的终点
		move(src, goal);
	else{
    
    
		hanio(n - 1, src, goal, middle);	//以 前n-1盘子为整体移到中间,
		move(src, goal);					//将剩余的一个移到目标位置,
		hanio(n - 1, middle, src, goal);	//再将n-1盘子为整体移到目标位置即可。
	}
}

int main()
{
    
    
	int n;
	m = 0;
	cout << "输入盘子个数:" << endl;
	cin >> n;
	cout << "结果如下:" << endl;
	hanio(n);
	cout << "所需步骤个数为:" << m << endl;
	return 0;
}

運用結果
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_45371989/article/details/108328184