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