#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <assert.h>
//递归:
//1.简化的思想
//2.判断是否停止的条件
//3.递归中逐渐接近停止条件
//对汉诺塔问题的分析:(分n = 2,n = 3,n任意3种情况分析)
//
//1.只存在两个盘子:
// 小盘子:a -> b
// 大盘子:a -> c
// 小盘子:b -> c
//
//2.存在3个盘子
// {
// 最上面的盘子:a -> c
// 第二个:a -> b
// 第一个:c -> b
// }
// 这时,前两个盘子经由c移至b,即前两个盘子:a -> c -> b
// 第三个:a -> c
// 上面两个:b -> a -> c
//
//3.当存在n个盘子
// 上面(n - 1):a -> c -> b
// 最下面:a -> c
// 上面(n - 1):b -> a -> c
long long int h_c(int n)//h_c代表将n个盘子从一个圆柱移动到另一个圆柱所需的步数
{
assert(n >= 0);
if (n > 0)
return(2 * h_c(n - 1) + 1);
else if (n == 0)
return 0;
}
int main()
{
for (int n = 1; n <= 9; n++)
{
printf("%lld\n", h_c(n));
}
return 0;
}