几乎有递归。最后一件事

时间:2012-03-27 21:51:24

标签: python list recursion concatenation

由于堆栈溢出,我几乎完成了一个让我疯狂的编程问题。这是递归的,这就是它的样子:

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']

我不太清楚如何做到这一点,任何帮助将不胜感激。

2 个答案:

答案 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 []