<p>两个建议(我没有查看文本文件,只是在这里介绍一下基本原则,并快速阅读一下您的代码):</p>
<ol><li>当您从getDegrees返回时,您仍然要在返回之后完成函数的其余部分。您需要返回True(或其他值)以指示搜索已结束,整个函数调用堆栈应该回滚。第一个返回将更改为“returntrue”,最后一行将更改为“if getDegrees(target,actor,dos):return True”。在</li>
<li>跟踪哪些演员已经被搜索过。如果两个演员互相表演,或者在关系中有一个循环,你会来回循环。</li></ol>
<p>此代码尝试修复返回和图形循环问题。然而,仍然有一个逻辑错误,凯文·培根和詹姆斯·贝卢斯希(2度分离度)给出了以下结论:</p>
<blockquote>
<p>Siravo, Joseph has 179 degree(s) of separation from Belushi, James</p>
</blockquote>
<p>编辑:通过添加“原始”参数修复。在</p>
<p>但递归问题是固定的。在</p>
<pre><code>##gets file with movie information
f = open("filename.txt")
actedWith = {}
ActorList = []
movies = {}
actedIn = []
dos = 1
def getDegrees(original, target, base, dos=0, seen=[]):
dos = dos+1
print " > checking %s against %s" % (target, base)
for actor in actedWith[base]:
#print "\t" + actor
if target == actor:
print original, "has ", dos, " degree(s) of separation from ", target
return True
for actor in actedWith[base]:
if actor in seen: continue
seen = seen + [actor]
if getDegrees(original, target, actor, dos, seen):
return True
return False
for l in f:
##strip of whitespace
l = l.strip()
##split by where forward-slashes are
l = l.split("/")
##add the first "word" on the line to the database of movie names
movies = {l[0] : l[1:]}
for e in l[1:]:
if e in actedWith:
actedWith[e] = actedWith[e]+movies[l[0]]
else:
actedWith[e] = movies[l[0]]
original = raw_input("Enter Actor Name (Last, First): ")
target = raw_input("Enter Second Actor Name (Last, First): ")
getDegrees(original, target, original)
</code></pre>
<p>示例:</p>
^{pr2}$