C++解决汉诺塔问题(递归实现)

简介: C++解决汉诺塔问题(递归实现)

问题描述:


常见的汉诺塔问题是根据一个传说形成的数学问题:

有三根杆子A,B,C,A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:

1.每次只能移动一个圆盘;

2.大盘不能叠在小盘上面。

提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。

问题:如何移?最少要移动多少次?


解决:


用递归的方式解决

image.png

image.png


移动次数总结为:2的n次方-1次 n是圆盘数目 其实在移动过程中可以将a,b,c3个圆盘堪称一个,移动4个圆盘的过程就像在移动两个圆盘。故移动n个圆盘可以分成3个步骤


1:把A上的n-1个圆盘移动到B上


2:把A上剩下的一个圆盘移动到C上


3:把B的n-1个圆盘移动到C上


代码如下

#include<iostream>
#include<cmath>
using namespace std;
void hannuo(int n, char x, char y, char z) {
  int count=0;
  if (n == 1)
  cout << "times:" << ++count<< " " << x << " -> " << z << endl;
  else {
  hannuo(n - 1, x, z, y);
  cout << "times" << ++count << " " << x << " -> " << z << endl;
  hannuo(n - 1, y, x, z);
  }
}
int main() {
int n;
  cout << "请输入圆盘数" << endl;
  cin >> n;
  cout << "总共移动了" << pow(2, n)-1<< "次" << endl;
  hannuo(n, 'A', 'B', 'C');
}
相关文章
汉诺塔问题(递归)/梵塔问题c++
汉诺塔问题(递归)/梵塔问题c++
|
算法 C++
C++快速幂(递归)
C++快速幂(递归)
【C++】递归,搜索与回溯算法入门介绍和专题一讲解
【C++】递归,搜索与回溯算法入门介绍和专题一讲解
|
7月前
|
设计模式 中间件 程序员
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
394 3
|
6月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
7月前
|
C++
C++ 递归与面向对象编程基础
C++ 递归是函数自我调用的技术,用于简化复杂问题。以递归求和为例,`sum` 函数通过不断调用自身累加数字直到 `k` 为 0。递归需谨慎,避免无限循环和资源浪费。面向对象编程(OOP)将程序划分为交互对象,具有属性和方法,提升代码复用、维护和扩展性。C++ OOP 基本概念包括类、对象、属性和方法。通过创建类和对象,利用点语法访问成员,实现代码组织。
51 0
|
7月前
|
Java Go Python
Golang每日一练(leetDay0103) 区域和检索1~3
Golang每日一练(leetDay0103) 区域和检索1~3
62 0
Golang每日一练(leetDay0103) 区域和检索1~3
|
7月前
|
Java Go C++
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
64 0
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
|
7月前
|
算法 C++ Java
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
57 0
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题