第二周项目三汉诺塔

来源:互联网 发布:创业软件官网 编辑:程序博客网 时间:2024/05/31 19:18

问题及代码

/* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:汉诺塔.cpp *作    者:李浩 *完成日期:2015年9月11日 *版 本 号:v1.0 * *问题描述:现在有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动?*输入描述:盘子的个数*程序输出: */  #include <stdio.h>#define discCount 4long move(int, char, char,char);int main(){    long count;    count=move(discCount,'A','B','C');    printf("%d个盘子需要移动%ld次\n", discCount, count);    return 0;}long move(int n, char A, char B,char C){    long c1,c2;    if(n==1)        return 1;    else    {        c1=move(n-1,A,C,B);        c2=move(n-1,B,A,C);        return c1+c2+1;    }}


运行结果

知识点总结

运用递归的方式对汉诺塔程序进行计算,首先我们肯定是把上面n-1个盘子移动到柱子C上,然后把最大的一块放在B上,最后把C上的所有盘子移动到B上,由此我们得出表达式:H⑴ = 1  H(n) = 2*H(n-1)+1 (n>1)那么我们很快就能得到H(n)的一般式: H(n) = 2^n - 1 (n>0),即输出结果

学习心得:

汉诺塔就是把n-1个饼移到B,再把第n个饼移到C,最后把n-1个饼移到C,这种计算极为复杂,运用合适的方式才能够得到很专业的计算。

0 0
原创粉丝点击