C语言利用递归解决汉诺塔问题

​​​​​​​如果对其他经典算法感兴趣,可以点击我的主页,有惊喜哟

#include<stdio.h>//汉诺塔问题
/*当 n=1 时,只需将编号为 1 的圆盘从塔座 A 移到塔座 C上即可;
当 n>1 时,需要分解步骤:
设法将塔座 A 上编号为1,2,··,n-1的n-1 个圆盘移到塔座 B上;
将编号为 n的圆盘从塔座 A 移到塔座 C上;
再设法将塔座 B 上编号为1,2,···,n-1的n-1 个圆盘移到塔座 C上;
这样求解 n 阶 hanoi 塔问题就转换为求解 n-1 阶 hanoi塔问题了。
如此递推下去,每次求解问题的规模就小1。*/ 
int move(char x,char y)
{
	printf("\n%c->%c",x,y);//将一个圆盘从x移到y 
}
void hanoi(int n,char a,char b,char c)//空类型函数,一整三字符 
{
	if(n==1)
	move(a,c);// 
	else
	{
		hanoi(n-1,a,c,b);//将n-1个圆盘从塔座a移到塔座b,塔座c过渡 
		move(a,c);//将第n个圆盘从塔座a移到塔座c 
		hanoi(n-1,b,a,c);// 将n-1个圆盘从塔座b移到塔座c,塔座a过渡 
	}
}
void main()
{
	int n,i,j=1;
	printf("请输入要移动的1圆盘数:");
	scanf("%d",&n);
	printf("移动圆盘的过程如下:");
	hanoi(n,'A','B','C');//这个赋值很重要 
	for(i=1;i<=n;j=j*2,i++);//咱写个循环就是为了绕过pow函数 
	printf("\n总共需要的步数为:%d",j-1);
	
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请看以下代码: ```c #include <stdio.h> void move(int n, char A, char B, char C) { if (n == 1) { printf("%c -> %c\n", A, C); return; } move(n - 1, A, C, B); printf("%c -> %c\n", A, C); move(n - 1, B, A, C); } int main() { int n; printf("请输入汉诺塔的层数:"); scanf("%d", &n); move(n, 'A', 'B', 'C'); return 0; } ``` 注意,这是使用递归解决汉诺塔问题的代码,如果你希望使用非递归解决汉诺塔问题,可以参考以下原理: 使用非递归方法解决汉诺塔问题可以使用栈来模拟递归过程。首先,建立一个栈,不断将问题压入栈中,直到问题被解决。具体步骤如下: 1.定义一个结构体,包含三个成员,分别代表盘子的大小、起始柱子和目标柱子。 2.按照递归的思路,将问题划分为多个子问题,并分别压入栈中,直到问题被分解到只有一个盘子时停止。 3.不断从栈中弹出问题,并依次解决它们,直到栈为空。对于每个问题,首先判断是否已经无法再分解,如果是,则直接移动盘子;如果不是,则先将子问题按照从小到大的顺序依次压入栈中。 下面是使用非递归方法解决汉诺塔问题的代码: ```c #include <stdio.h> #include <stdlib.h> struct StackNode { int n; // 盘子的大小 char from, to; // 起始柱子和目标柱子 int step; // 步数 }; struct Stack { struct StackNode *data; // 栈中存储的数据 int max_size; // 栈的大小 int top; // 栈顶位置 }; void init_stack(struct Stack *s, int max_size) { s->data = (struct StackNode *) malloc(max_size * sizeof(struct StackNode)); s->max_size = max_size; s->top = -1; } void push(struct Stack *s, struct StackNode *x) { if (s->top == s->max_size - 1) { printf("Stack is full!\n"); return; } s->top++; s->data[s->top] = *x; } void pop(struct Stack *s) { if (s->top == -1) { printf("Stack is empty!\n"); return; } s->top--; } struct StackNode *top(struct Stack *s) { if (s->top == -1) { printf("Stack is empty!\n"); return NULL; } return &(s->data[s->top]); } int is_stack_empty(struct Stack *s) { return s->top == -1; } void move(int n, char from, char to, int step) { printf("%c -> %c, Step %d\n", from, to, step); } void hanoi(int n, char from, char to) { struct Stack s; init_stack(&s, 100); struct StackNode node; node.n = n; node.from = from; node.to = to; node.step = 0; push(&s, &node); while (!is_stack_empty(&s)) { struct StackNode *cur = top(&s); if (cur->n == 1) { move(1, cur->from, cur->to, cur->step + 1); pop(&s); } else if (cur->n > 1) { if (is_stack_empty(&s)) { printf("Stack is empty!\n"); break; } struct StackNode *next = top(&s); if (next->n != cur->n - 1) { node.n = cur->n - 1; node.from = cur->from; node.to = get_other_peg(cur->from, cur->to); node.step = cur->step; push(&s, &node); } else { move(1, cur->from, cur->to, cur->step + 1); pop(&s); if (!is_stack_empty(&s)) { next = top(&s); if (next->n != cur->n - 1) { node.n = cur->n - 1; node.from = get_other_peg(cur->from, cur->to); node.to = cur->to; node.step = cur->step + 1; push(&s, &node); } else { move(1, cur->to, next->to, cur->step + 2); pop(&s); } } else break; } } else break; } } int main() { int n; printf("请输入汉诺塔的层数:"); scanf("%d", &n); hanoi(n, 'A', 'C'); return 0; } char get_other_peg(char a, char b) { switch (a) { case 'A': if (b == 'B') return 'C'; if (b == 'C') return 'B'; case 'B': if (b == 'A') return 'C'; if (b == 'C') return 'A'; case 'C': if (b == 'A') return 'B'; if (b == 'B') return 'A'; } return ' '; } ``` 这里使用了一个栈来模拟递归过程,具体实现可以参考代码注释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值