• 1、一日一程序之C语言的Hanoi问题


    Hanoi搭问题
    请先自行百度什么是Hanoi搭问题。。这是一个典型的递归算法,请好好学习哦!
    先分析算法:
    如果n=1,则将圆盘从A直接移动到C。
    如果n=2,则:
    1.将A上的n-1(等于1)个圆盘移到B上;
    2.再将A上的一个圆盘移到C上;
    3.最后将B上的n-1(等于1)个圆盘移到C上。

    如果n=3,则:
    A. 将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),
    步骤如下:
    (1)将A上的n`-1(等于1)个圆盘移到C上,见图5.5(b)。
    (2)将A上的一个圆盘移到B,见图5.5(c)
    (3)将C上的n`-1(等于1)个圆盘移到B,见图5.5(d)
    B. 将A上的一个圆盘移到C,见图5.5(e)
    C. 将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),
    步骤如下:
    (1)将B上的n`-1(等于1)个圆盘移到A,见图5.5(f)
    (2)将B上的一个盘子移到C,见图5.5(g)
    (3)将A上的n`-1(等于1)个圆盘移到C,见图5.5(h)。
    到此,完成了三个圆盘的移动过程。、从上面分析可以看出,当n大于等于2时, 移动的过程可分解为
    三个步骤:
    第一步 把A上的n-1个圆盘移到B上;
    第二步 把A上的一个圆盘移到C上;
    第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。
    当n=3时,第一步和第三步又分解为类同的三步,即把n`-1个圆盘从一个针移到另一个针上,这里的n`=n-1。 显然这是一个递归过程,据此算法可编程如下:
    #include "stdio.h"
    
    move(int n,int x,int y,int z)
    {
    	if(n==1)
    		printf("%c-->%c\n",x,z);
    	else
    	{
    		move(n-1,x,z,y);
    		printf("%c-->%c\n",x,z);
    		move(n-1,y,x,z);
    	}
    }
    main()
    {
    	int h;
    	printf("\ninput number:\n");
    	scanf("%d",&h);
    	printf("the step to moving %2d diskes:\n",h);
    	move(h,'a','b','c');
    }
    
    从程序中可以看出,move函数是一个递归函数,它有四个形参n,x,y,z。n表示圆盘数,x,y,z分别表示三根针。move 函数的功能是把x上的n个圆盘移动到z 上。当n==1时,直接把x上的圆盘移至z上,输出x→z。如n!=1则分为三步:递归调用move函数,把n-1个圆盘从x移到y;输出x→z;递归调用move函数,把n-1个圆盘从y移到z。在递归调用过程中n=n-1,故n的值逐次递减,最后n=1时,终止递归,逐层返回。当n=4 时程序运行的结果为






  • 相关阅读:
    assign()与create()的区别
    ES6对象扩展——部分新的方法和属性
    ES6对象扩展——扩展运算符
    rest operater剩余操作符
    深拷贝和浅拷贝
    for in和for of的简单区别
    查询ES6兼容的网站
    ES6扩展——对象的扩展(简洁表示法与属性名表达式)
    滚动条设置样式
    marquee横向无缝滚动无js
  • 原文地址:https://www.cnblogs.com/niaobulashi/p/16088379.html
Copyright © 2020-2023  润新知