由于堆栈溢出,我几乎完成了一个让我疯狂的编程问题。这是递归的,这就是它的样子:
def changeling(word,target,steps):
x=word
z=target
if steps==0:
return []
if x==z:
return [z]
if len(word)!=len(target):
print "error"
return None
i=1
if lookup(z[0]+x[1:]) is True and z[0]+x[1:]!=x :
word=z[0]+x[1:]
while i!=len(x):
if lookup(x[:i-1]+z[i-1]+x[i:]) and x[:i-1]+z[i-1]+x[i:]!=x:
word=x[:i-1]+z[i-1]+x[i:]
i+=1
if lookup(x[:len(x)-1]+z[len(word)-1]) and x[:len(x)-1]+z[len(x)-1]!=x :
word=x[:len(x)-1]+z[len(word)-1]
return [x]+changeling(word,target,steps-1)
如果我输入:
changeling("find","lose"4)
我收到:
['find', 'fine', 'line', 'lone', 'lose']
这是我想要的确切输出。我的下一步是这个。如果在一定数量的步骤中无法将单词更改为目标单词,则该函数将返回None。所以,如果我要输入:
低能( “查找”, “输”,3)
我不应该收到任何东西,而是收到:
['find', 'fine', 'line']
我不太清楚如何做到这一点,任何帮助将不胜感激。
答案 0 :(得分:2)
不是立即返回递归,而是按照以下步骤操作:
y = changeling(word,target,steps-1)
if y :
return [x] + y
else:
return None
原始版本的问题在于您返回已使用,附加,以下步骤计算的内容。如果你找不到一个好词继续链,那么你的程序会输出None
,因此你的return语句由一系列有效步骤+ None组成,这相当于只有有效列表脚步。在这里,我们所做的只是检查是否可以实现以下步骤,如果不是,我们只返回None
,如果是,则返回所有内容。
答案 1 :(得分:0)
您只需要更改最终的退货声明:
我在python中不够流利,不能给你确切的代码,所以这里是伪代码:
subReturnValue = changeling(word, target, steps-1)
if(subReturnValue.length == (steps-1)) then
return [x] + subReturnValue
else
return []