汉诺塔递归结构

来源:互联网 发布:mac软件删除不彻底 编辑:程序博客网 时间:2024/06/05 07:29

汉诺塔递归结构 f(n),n为塔盘数,上图演示的是n为3时的移动方式;(已3为基数,是因为3盘7次是递归的最小因子)

f(3)时;移动方式为 A-C,A-B,C-B,A-C,B-A,B-C,A-C (X,Y,Z)

f(4)时;是将3块圆盘从A-B ,将最后一块A-C,再将3块圆盘从B-C;

f(5)时;是将4块圆盘从A-B ,再最后一块将A-C,再将4块圆盘从B-C;

f(n)时;是将n-1块圆盘从A-B ,再最后一块将A-C,再将4块圆盘从B-C;


#include <stdio.h>void change(char x, char y, char z){printf("%c--%c\n", x, z);printf("%c--%c\n", x, y);printf("%c--%c\n", z, y);printf("%c--%c\n", x, z);printf("%c--%c\n", y, x);printf("%c--%c\n", y, z);printf("%c--%c\n", x, z);return;}int f(int n){if(n > 3) {change('A','C','B');//前面n-1个圆盘从A移到B printf("%c--%c\n", 'A', 'C');<span style="white-space:pre"></span>//圆盘n  A--C change('C','A','B');//前面n-1个圆盘从B移到C n = f(n-1);}return n;}int times(int n){if(3 == n)return 7;//n为3时,移动次数else{n = 2 * times(n-1) + 1;return n;}}int main(void){int ht;printf("请输入汉诺塔层数\nht = ");scanf("%d", &ht);if(ht > 3){printf("移动方式为:\n");f(ht);printf("共计移动%d次\n", times(ht));}else if(3 == ht){printf("移动方式为:\n");change('A','B','C');printf("共计移动%d次\n", times(ht)); }elseprintf("请输入大于或者等于3的数字\n");return 0;}


0 0
原创粉丝点击