人工智能——汉诺塔问题

题目:
汉诺塔问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔A上的碟子移动到塔C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成任务时,世界末日也就到了。
采用问题归约法把汉诺塔问题分成以下三个步骤实现:
1.将塔A上的n-1个碟子借助塔C先移到塔B上
2.把塔A上剩下的一个碟子移到塔C上
3.把n-1个碟子从塔B借助于塔A移到塔C上
实验要求:
1.让盘子数从2 开始到7进行实验,记录程序运行时间和递归调用次数。
2.画出盘子数n和运行时间t 、递归调用次数m的关系图,并进行分析

题目解析:
1.汉诺塔问题规约编程
2.程序运行时间输出
3.递归调用计时器设计

代码:

import copy
import time

# 状态数组初始化,一开始所有盘都在第一个柱子
def init_status(n):
    status = []
    s = []
    for i in range(n):
        s.clear()
        s.append(chr(i+ord('A')))
        s.append(1)
        status.append(copy.deepcopy(s))
    return status
# 返回塔符号对应的索引位置 eg:A->1 B->2 C->3 ...
def find_index(s, status):
    for i in range(len(status)):
        if status[i][0] == s:
            return i+1
    return -1
# 打印状态数组
def print_status(status, n):
    # 对问题描述的状态进行打印
    for i in range(n):
        print(status[i][1], end="")
    print("\n")
# 对梵塔问题进行问题规约,An-1->B, A_last->C, Bn-1->C
def Fanta(N, n, a, b, c, status):
    global use_time
    use_time = use_time + 1
    if n == 1:
        # print(str(n)+":"+a+"->"+c)
        # 将当前块对应的状态改为c塔对应的索引
        status[n-1][1] = find_index(c, status)
        # print_status(status, N)
    else:
        Fanta(N, n-1, a, c, b, status)
        # print(str(n)+":"+a+"->"+c)
        # 将当前块对应的状态改为c塔对应的索引
        status[n-1][1] = find_index(c, status)
        # print_status(status, N)
        Fanta(N, n-1, b, a, c, status)


if __name__ == "__main__":
    print("输入圆盘数n:")
    n = int(input())
    start = time.time()
    status = init_status(n)
    # print_status(status, n)
    # 用于记录一共使用多少次递归
    use_time = 0
    Fanta(n, n, 'A', 'B', 'C', status)
    end = time.time()
    print("n=", n, ",程序运行时间为:", ((end - start) * 1000000), "us")
    print("n=", n, ",递归调用次数为:", use_time)

你可能感兴趣的:(AI)