C语言中,递归算法通过将复杂问题分解为更小的相同问题来解决,是计算机科学中一种重要的编程技巧。通过汉诺塔问题,可以直观地看到递归如何将一个大问题分解为一系

1、一般递归解法

最常见的解法,按照经典的递归思路来移动盘子。

#include <stdio.h>

void hanoi(int n, char src, char dest, char aux) {
    if (n == 1) {
        printf("Move disk 1 from %c to %c\n", src, dest);
        return;
    }
    hanoi(n - 1, src, aux, dest);
    printf("Move disk %d from %c to %c\n", n, src, dest);
    hanoi(n - 1, aux, dest, src);
}

int main() {
    int n = 3;  // 可以修改n的值测试不同的盘子数
    hanoi(n, 'A', 'C', 'B');
    return 0;
}

2、使用尾递归优化

尾递归可以优化递归调用,减少栈的消耗,不过这个方法在汉诺塔问题中的应用不明显。

#include <stdio.h>

void hanoiTailRec(int n, char src, char dest, char aux, int originalN) {
    if (n == 0) return;

    if (n == 1) {
        printf("Move disk %d from %c to %c\n", originalN, src, dest);
        return;
    }

    hanoiTailRec(n - 1, src, aux, dest, originalN);
    printf("Move disk %d from %c to %c\n", originalN - n + 1, src, dest);
    hanoiTailRec(n - 1, aux, dest, src, originalN);
}

void hanoi(int n, char src, char dest, char aux) {
    hanoiTailRec(n, src, dest, aux, n);
}

int main() {
    int n = 3;
    hanoi(n, 'A', 'C', 'B');
    return 0;
}

3、使用栈模拟递归

通过手动管理一个栈来模拟递归调用,这种方法可以帮助理解递归的工作原理,并且在某些情况下可以优化递归的性能。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int n;
    char src;
    char dest;
    char aux;
    int step;
} Frame;

void hanoiIterative(int n, char src, char dest, char aux) {
    Frame* stack = (Frame*)malloc(n * sizeof(Frame));
    int top = -1;

    stack[++top] = (Frame){n, src, dest, aux, 0};

    while (top >= 0) {
        Frame* f = &stack[top];

        if (f->n == 1 && f->step == 0) {
            printf("Move disk %d from %c to %c\n", f->n, f->src, f->dest);
            top--;
        } else if (f->step == 0) {
            f->step = 1;
            stack[++top] = (Frame){f->n - 1, f->src, f->aux, f->dest, 0};
        } else if (f->step == 1) {
            printf("Move disk %d from %c to %c\n", f->n, f->src, f->dest);
            f->step = 2;
            stack[++top] = (Frame){f->n - 1, f->aux, f->dest, f->src, 0};
        } else {
            top--;
        }
    }

    free(stack);
}

int main() {
    int n = 3;
    hanoiIterative(n, 'A', 'C', 'B');
    return 0;
}

4、递归优化

通过优化递归调用,减少不必要的函数调用和变量复制,提高程序的执行效率。

#include <stdio.h> 
 
void hanoi_optimized(int n, char from, char to, char aux) { 
    static int depth = 0; 
    depth++; 
    if (n == 1) { 
        printf("Move disk 1 from %c to %c\n", from, to); 
        depth--; 
        return; 
    } 
    if (depth < 100) { // 限制递归深度,防止栈溢出 
        hanoi_optimized(n - 1, from, aux, to); 
        printf("Move disk %d from %c to %c\n", n, from, to); 
        hanoi_optimized(n - 1, aux, to, from); 
    } 
    depth--; 
} 
 
int main() { 
    int n = 3; // Number of disks 
    hanoi_optimized(n, 'A', 'C', 'B'); // A, B and C are names of rods 
    return 0; 
} 

推荐文档

相关文档

大家感兴趣的内容

随机列表