python中递归和循环有什么区别_Python中的无限循环与递归

我正致力于实现一个迭代的深化深度优先搜索,以找到8 puzzle problem的解决方案。我对寻找实际的搜索路径本身并不感兴趣,而是想知道程序运行所需的时间。(我还没有实现计时功能)。在

但是,我在实现实际搜索功能时遇到了一些问题(向下滚动查看)。我粘贴了目前为止所有的代码,所以如果你复制粘贴这个,你也可以运行它。这可能是描述我遇到的问题的最好方法…我只是不明白为什么在递归过程中会出现无限循环,例如在谜题2(p2)的测试中,第一次扩展应该会产生一个解决方案。我想这可能与没有在一行代码前面添加“Return”有关(下面对其进行了注释)。当我添加返回值时,我可以通过谜题2的测试,但是像谜题3这样更复杂的东西失败了,因为现在的代码似乎只扩展了最左边的分支。。。在

在这里干了好几个小时,放弃了希望。如果你能指出我的错误,我将非常感激你能再多看一眼。谢谢您!在#Classic 8 puzzle game

#Data Structure: [0,1,2,3,4,5,6,7,8], which is the goal state. 0 represents the blank

#We also want to ignore "backward" moves (reversing the previous action)

p1 = [0,1,2,3,4,5,6,7,8]

p2 = [3,1,2,0,4,5,6,7,8]

p3 = [3,1,2,4,5,8,6,0,7]

def z(p): #returns the location of the blank cell, which is represented by 0

return p.index(0)

def left(p):

zeroLoc = z(p)

p[zeroLoc] = p[zeroLoc-1]

p[zeroLoc-1] = 0

return p

def up(p):

zeroLoc = z(p)

p[zeroLoc] = p[zeroLoc-3]

p[zeroLoc-3] = 0

return p

def right(p):

zeroLoc = z(p)

p[zeroLoc] = p[zeroLoc+1]

p[zeroLoc+1] = 0

return p

def down(p):

zeroLoc = z(p)

p[zeroLoc] = p[zeroLoc+3]

p[zeroLoc+3] = 0

return p

def expand1(p): #version 1, which generates all successors at once by copying parent

x = z(p)

#p[:] will make a copy of parent puzzle

s = [] #set s of successors

if x == 0:

s.append(right(p[:]))

s.append(down(p[:]))

elif x == 1:

s.append(left(p[:]))

s.append(right(p[:]))

s.append(down(p[:]))

elif x == 2:

s.append(left(p[:]))

s.append(down(p[:]))

elif x == 3:

s.append(up(p[:]))

s.append(right(p[:]))

s.append(down(p[:]))

elif x == 4:

s.append(left(p[:]))

s.append(up(p[:]))

s.append(right(p[:]))

s.append(down(p[:]))

elif x == 5:

s.append(left(p[:]))

s.append(up(p[:]))

s.append(down(p[:]))

elif x == 6:

s.append(up(p[:]))

s.append(right(p[:]))

elif x == 7:

s.append(left(p[:]))

s.append(up(p[:]))

s.append(right(p[:]))

else: #x == 8

s.append(left(p[:]))

s.append(up(p[:]))

#returns set of all possible successors

return s

goal = [0,1,2,3,4,5,6,7,8]

def DFS(root, goal): #iterative deepening DFS

limit = 0

while True:

result = DLS(root, goal, limit)

if result == goal:

return result

limit = limit + 1

visited = []

def DLS(node, goal, limit): #limited DFS

if limit == 0 and node == goal:

print "hi"

return node

elif limit > 0:

visited.append(node)

children = [x for x in expand1(node) if x not in visited]

print "\n limit =", limit, "---",children #for testing purposes only

for child in children:

DLS(child, goal, limit - 1) #if I add "return" in front of this line, p2 passes the test below, but p3 will fail (only the leftmost branch of the tree is getting expanded...)

else:

return "No Solution"

#Below are tests

print "\ninput: ",p1

print "output: ",DFS(p1, goal)

print "\ninput: ",p2

print "output: ",DLS(p2, goal, 1)

#print "output: ",DFS(p2, goal)

print "\ninput: ",p3

print "output: ",DLS(p3, goal, 2)

#print "output: ",DFS(p2, goal)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值