美文网首页
10 汉诺塔(递归)

10 汉诺塔(递归)

作者: _Mirage | 来源:发表于2020-07-24 10:57 被阅读0次
汉诺塔问题都很熟悉,是一种典型的递归问题。 image.png

一般学习递归都会从这个例子学起,它的难度也不是特别大。

分析:

  1. 边界条件:
    n = 1 时,直接把盘子从A盘移动到C盘即可。

  2. 状态转移方程:
    定义 f(n, A, B, C) 表示将n个盘子从A盘移动到C盘(借助中间盘B)
    则 f(n, A, B, C) = f(n - 1, A, C, B) + f(n - 1, B, A, C)
    解释:直接把上面n-1个盘子当成整体先移动到中间盘B(中间盘C),然后剩下的一个盘子直接移动到C,然后再把B盘上当成整体的n-1个盘子移动到C(中间盘A)即可。

源码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

void hanota(int n, char a, char b, char c) {
    if (n == 1) {
        printf("%c->%c\n", a, c);
        return;
    }
    hanota(n - 1, a, c, b);
    printf("%c->%c\n", a, c);
    hanota(n - 1, b, a, c);
}

void solve(int n) {
    hanota(n, 'A', 'B', 'C');
}

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    solve(n);

    return 0;
}
运行结果: image.png

相关文章

网友评论

      本文标题:10 汉诺塔(递归)

      本文链接:https://www.haomeiwen.com/subject/drcjlktx.html