字符串形式的汉诺塔(Tower of Hanoi)Python语言实现

从昨天半下午就开始想这个问题,到现在经过30个小时左右(期间并不思考是非常集中,因为连续思考很累而且可能效果不佳),终于把程序搞定了,第一次思考问题这么久.算是第一个自主思考的程序还是很有成就感的.

代码优势:模块化做的很好,找到了通过写出前4-5次的数学表达,找到了规律并将其化成代码.

代码劣势:规则化欠佳,因python无指针(网上说的,还不确定),没有学到python中类似c语言指针的函数,造成本来一个模块不得不分解为6个模块相互调用.并且函数封装不好,即因为不会类指针方法,所以用函数操作了全局变量.

上代码:

def ac(k):
    global a
    global b
    global c
    if k==2:
        b+=a[-1];a=a[:-1]
        c+=a[-1];a=a[:-1]
        c+=b[-1];b=b[:-1]
    else:
        ab(k-1)     ###############
        c+=a[-1];a=a[:-1]
        bc(k-1)

def ab(k):
    global a
    global b
    global c
    if k==2:
        c+=a[-1];a=a[:-1]
        b+=a[-1];a=a[:-1]
        b+=c[-1];c=c[:-1]
    else:
        ac(k-1)
        b+=a[-1];a=a[:-1]
        cb(k-1)
def cb(k):
    global a
    global b
    global c
    if k==2:
        a+=c[-1];c=c[:-1]
        b+=c[-1];c=c[:-1]
        b+=a[-1];a=a[:-1]
    else:
        ca(k-1)
        b+=c[-1];c=c[:-1]
        ab(k-1)

def ca(k):
    global a
    global b
    global c
    if k==2:
        b+=c[-1];c=c[:-1]
        a+=c[-1];c=c[:-1]
        a+=b[-1];b=b[:-1]
    else:
        cb(k-1)
        a+=c[-1];c=c[:-1]
        ba(k-1)

def ba(k):
    global a
    global b
    global c
    if k==2:
        c+=b[-1];b=b[:-1]
        a+=b[-1];b=b[:-1]
        a+=c[-1];c=c[:-1]
    else:
        bc(k-1)
        a+=b[-1];b=b[:-1]
        ca(k-1)

def bc(k):
    global a
    global b
    global c
    if k==2:
        a+=b[-1];b=b[:-1]
        c+=b[-1];b=b[:-1]
        c+=a[-1];a=a[:-1]
    else:
        ba(k-1)
        c+=b[-1];b=b[:-1]
        ac(k-1)

a='fedcba9876543210'
b=''
c=''
ac(len(a))
print('a:{0}\nb:{1}\nc:{2}\n'.format(a,b,c))

输出为:

a:
b:
c:fedcba9876543210

举一反三:上述代码是字符串形式的汉诺塔,容量有限且处理16个以上元素时表示不方便,后面会写一个列表形式的汉诺塔.

猜你喜欢

转载自www.cnblogs.com/zhangziyan/p/9196725.html