递归方法实现汉诺塔问题的C语言代码
时间: 2023-10-26 18:12:33 浏览: 153
当然,下面是递归方法实现汉诺塔问题的C语言代码:
```
#include <stdio.h>
void move(int n, char a, char b, char c);
void move(int n, char a, char b, char c)
{
if(n == 1)
printf("%c-->%c\n", a, c);
else
{
move(n - 1, a, c, b);
printf("%c-->%c\n", a, c);
move(n - 1, b, a, c);
}
}
int main()
{
int n;
printf("Please input the number of disks: ");
scanf("%d", &n);
printf("The steps of moving %d disks:\n", n);
move(n, 'A', 'B', 'C');
return 0;
}
```
相关问题
非递归方法实现汉诺塔问题的C语言代码
下面是非递归方式实现汉诺塔问题的C语言代码:
```C
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 1000
#define ElemType int
//定义栈结构
typedef struct {
int top;
ElemType A[MaxSize];
} Stack;
//初始化栈
void InitStack(Stack *S) {
S->top = 0;
}
//判断栈是否为空
int IsEmptyStack(Stack *S) {
return S->top == 0;
}
//判断栈是否已满
int IsFullStack(Stack *S) {
return S->top == MaxSize;
}
//入栈
void Push(Stack *S, ElemType e) {
if (IsFullStack(S)) {
printf("Stack is full!\n");
exit(1);
} else {
S->A[S->top++] = e;
}
}
//出栈
ElemType Pop(Stack *S) {
if (IsEmptyStack(S)) {
printf("Stack is empty!\n");
exit(1);
} else {
return S->A[--S->top];
}
}
//非递归方式实现汉诺塔
void Hanoi(int n) {
Stack *S = (Stack *) malloc(sizeof(Stack));
InitStack(S);
int i;
for (i = n; i >= 1; i--) {
Push(S, i);
}
int j;
ElemType x, y;
for (j = 1; j <= (1 << n) - 1; j++) {
if (j % 3 == 1) {
x = Pop(S);
printf("%d: Move disk %d from A to C\n", j, x);
Push(S, x);
} else if (j % 3 == 2) {
y = Pop(S);
printf("%d: Move disk %d from A to B\n", j, y);
x = Pop(S);
printf("%d: Move disk %d from A to C\n", j, x);
Push(S, y);
Push(S, x);
} else {
y = Pop(S);
printf("%d: Move disk %d from B to C\n", j, y);
Push(S, y);
}
}
free(S);
}
//主函数
int main() {
int n = 3;
Hanoi(n);
return 0;
}
```
此代码使用栈实现了汉诺塔问题的非递归解法。每次移动都是在栈中进行的,而不是通过递归调用函数实现。当然,这只是一种特殊的解法,使用递归调用函数依然是汉诺塔问题的标准解法。
汉诺塔问题C语言代码
汉诺塔是一个经典的递归问题,它涉及将一组圆盘从一根柱子移动到另一根柱子,规则是每次只能移动一个大盘子,并且任何时候大盘子都不能放在小盘子之上。下面是一个简单的C语言实现:
```c
#include <stdio.h>
// 定义汉诺塔函数,towerHanoi
void towerHanoi(int n, char from_rod, char to_rod, char aux_rod) {
if (n > 0) { // 如果有圆盘
// 将n - 1个较小的圆盘从from移到aux
towerHanoi(n - 1, from_rod, aux_rod, to_rod);
// 将最大的圆盘从from移动到to
printf("Move disk %d from rod %c to rod %c\n", n, from_rod, to_rod);
// 最后,将n - 1个小圆盘从aux移到to
towerHanoi(n - 1, aux_rod, to_rod, from_rod);
}
}
int main() {
int num_disks; // 圆盘的数量
printf("Enter the number of disks: ");
scanf("%d", &num_disks);
towerHanoi(num_disks, 'A', 'C', 'B'); // A表示起始柱子,C表示目标柱子,B作为辅助
return 0;
}
```
在这个程序中,`towerHanoi`函数通过递归实现了汉诺塔策略。当输入圆盘数量 `n` 为0时,函数结束,否则会按照递归的方式反复转移较小的圆盘。
阅读全文