汉诺问题:3个座A, B,C, 在A座有64个大小不等的盘,现在要把64个盘转移到另一个座,每次只能移动一个盘,且大盘不能放在小盘上面。思考过程。1)移动1个盘到另一个座需要搬1次,记a(1) = 12)移动2个盘:在已...
汉诺问题:3个座A, B,C, 在A座有64个大小不等的盘,现在要把64个盘转移到另一个座,每次只能移动一个盘,且大盘不能放在小盘上面。
思考过程。
1)移动1个盘到另一个座需要搬1次,记
a(1) = 1
2)移动2个盘:在已经移动1个盘的基础上(用a1次),将第2个盘放到另一个空座(1次),然后再将第1个盘移动到第2个盘上,需要a1次,记
a(2) = 2 * a(1) + 1
3)移动3个盘:在已经移动2个盘的基础上(用a2次),将第3个盘放到另一个空座(1次),然后再将前2个盘移动到第3个盘上,需要a2次,记
a(3) = 2 * a(2) + 1
。。。。。。
a(n) = 2 * a(n - 1) + 1
规律很明显,但貌似不符合递归的思维方式。
但是先按递归程序的写法练一下再说。。。
#include <stdio.h>
#include <math.h>
double hanio(int n);
int main(void)
{
int n;
double m;
printf("Enter n:");
scanf("%d", &n);
printf("%.0f\n", hanio(n));
m = pow(2, n) - 1;
printf("%.0f\n", m);
return 0;
}
double hanio(int n)
{
double result;
if(n == 1)
result = 1;
else
result = 2 * hanio(n - 1) + 1;
return result;
}
此处用公式m = pow(2, n) - 1来验证结果的正确性。
运行,
Enter n:64
18446744073709551616
18446744073709551616
完成。
本文标题为:开始学习C语言递归程序,汉诺(hanoi)塔问题尝试
基础教程推荐
- 如何告诉 MinGW 链接器不要导出所有符号? 2022-10-07
- C语言文件操作与相关函数介绍 2023-06-13
- C/C++ Qt StatusBar底部状态栏应用教程 2023-01-10
- C语言实现简易停车场管理系统 2023-03-13
- C语言预编译#define(预处理) 2023-04-03
- C++高级数据结构之并查集 2023-04-20
- 漫画讲解C语言中最近公共祖先的三种类型 2023-01-01
- 使用C/C++读写.mat文件的方法详解 2023-03-05
- 使用VS2022开发在线远程编译部署的C++程序(图文详解) 2023-01-15
- C++类和对象到底是什么 2022-11-12
