杨辉三角和汉诺塔python实现

杨辉三角

杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。

杨辉三角性质及规律

  1. 每个数等于它上方两数之和。

  2. 每行数字左右对称,由1开始逐渐变大。

  3. 第n行的数字有n项。

  4. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。

  5. 第n行的第m个数和第n-m+1个数相等 ,为组合数性质之一。

  6. 每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即 C(n+1,i)=C(n,i)+C(n,i-1)

  7. (a+b)^n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。

汉诺塔

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

汉诺塔算法介绍

     算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;

若n为奇数,按顺时针方向依次摆放 A C B。

⑴按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。

⑵接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。

⑶反复进行⑴⑵操作,最后就能按规定完成汉诺塔的移动。

所以结果非常简单,就是按照移动规则向一个方向移动金片:

如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

杨辉三角和汉诺塔python代码

#杨辉三角函数
def yanghui(n):
    if not str(n).isdecimal() or n<2 or n>25:
        print('杨辉三角函数必须为yanghui(n),参数必须\
是不小于2且不大于25的正整数')
        return False
    x=[]
    for i in range(1,n+1):
        x.append([1]*i)
    for i in range(2,n):
        for j in range(1,i):
            x[i][j]=x[i-1][j-1]+x[i-1][j]

    for i in range(n):
        if n<=10: print(' '*(40-4*i),end='')
        for j in range(i+1):
            print('%-8d'%x[i][j],end='')
        print()
#杨辉三角函数结束


       
#汉诺塔游戏函数
_times=0
def hannuota(nlist,mfrom,mpass,mto):
    global _times
    n=len(nlist)
    if n==1:
        _times+=1
        print('%-8d'%_times,nlist[0],':',mfrom,'------->',mto)
        return
    else:
        hannuota(nlist[:n-1],mfrom,mto,mpass)
        hannuota(nlist[-1],mfrom,mpass,mto)
        hannuota(nlist[:n-1],mpass,mfrom,mto)
#汉诺塔游戏函数结束

if __name__=='__main__':
    print('模块独立自运行测试输出:')
    print('一、10阶杨辉三角如下:')
    yanghui(10)
    print('二、三阶汉诺塔模拟过程如下')
    print('step    num:from------->to')
    hannuota(['0','1','2'],'A','B','C')



   

运行结果

猜你喜欢

转载自blog.csdn.net/qq_42304949/article/details/90141185