现在的位置: 首页 > 06 函数 > 正文

经典递归问题:汉诺塔问题

2013年11月27日 06 函数 ⁄ 共 743字 ⁄ 字号 经典递归问题:汉诺塔问题已关闭评论

汉诺塔问题是递归中的经典,通过简单的递归思想解决了复杂的问题。

汉诺塔问题

古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可利用B座。
请编程序输出移动这些盘子的详细步骤。

汉诺塔问题 hanoi tower

这个问题的框架已经给你搭好了,只需要在 else 部分写三句话(3个动作,其中2个和 n-1 有关)就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
void move(char a, char b)
{
    printf("move %c -> %c\n", a, b);
}
 
void hanoi(int n,char one,char two,char three)
{
    if (n==1) move(one, three);
    else {
 
    }
}
 
int main()
{
    hanoi(3, 'A', 'B', 'C');
    return 0;
}

你一定要好好琢磨琢磨,如果能想出来,你的C语言功力会有巨大的提升哦!

下面有答案!看看和你想的是不是一样。

汉诺塔问题 hanoi tower 完整程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
void move(char a, char b)
{
    printf("move %c -> %c\n", a, b);
}
 
void hanoi(int n,char one,char two,char three)
{
    if (n==1) move(one, three);
    else {
        hanoi(n-1, one, three, two);
        move(one, three);
        hanoi(n-1, two, one, three);
    }
}
 
int main(int argc, char *argv[])
{
    hanoi(3, 'A', 'B', 'C');
    return 0;
}

抱歉!评论已关闭.