Python递归函数不返回

时间:2016-03-14 19:25:31

标签: python recursion

我试图通过尝试我儿子在大学CS课上遇到的问题来提高我的菜鸟Python技能。目标是创建一个使用递归来处理列表的函数。该函数必须接受任意长度的列表并返回一个新列表,其中每个元素是其自身和其右侧元素的总和。因此,如果您输入列表[5,3,2,4],该函数应返回[14,19,6,4]。

我已经在Python中编写了以下代码,如果我使用" print"它可以正常工作在递归函数中命令显示最终值,但它不会传递其返回值。最终结果是"无。"

为什么变量没有正确返回?

def RecursiveProcess(ListIn2, target): #Recursive function that adds to target value the value to its right
    if target > -1:  #stop function if index is below 0
        ListIn2[target] = ListIn2[target] + ListIn2[target+1]  #Add value to the right of target to the target value 
        ListIn2 = RecursiveProcess(ListIn2, target-1) #Call the function again with lower taget value to process the next value
    else:
        return ListIn2  #return the changed list

def ProcessList(ListIn):  #helper function to pass the list and the position of penultimate value
    return RecursiveProcess(ListIn, len(ListIn)-2) #return the changed list

print ProcessList([5, 10, 11, 6, 7, 1, 2, 4, 6, 7])  #initiate recursion and print result

3 个答案:

答案 0 :(得分:4)

您需要实际返回RecursiveProcess。请看下面的修改后的代码。

如果你所做的只是调用函数并将值存储在ListIn2中,那么你并不是递归地做任何事情。您将继续覆盖以前的数据。通过返回,您将最终获得递归行为:

def RecursiveProcess(ListIn2, target): #Recursive function that adds to target value the value to its right
    if target > -1:  #stop function if index is below 0
        ListIn2[target] = ListIn2[target] + ListIn2[target+1]  #Add value to the right of target to the target value
        return RecursiveProcess(ListIn2, target-1) #Call the function again with lower taget value to process the next value
    else:
        return ListIn2  #return the changed list

l = [5, 10, 11, 6, 7, 1, 2, 4, 6, 7]
d = RecursiveProcess(l, len(l)-2)
print(d) # [59, 54, 44, 33, 27, 20, 19, 17, 13, 7]

答案 1 :(得分:2)

问题在于你实际上并没有进行递归(每次调用相同的函数都会返回结果),但由于列表是可变的,所以你不需要:

def ProcessList(ListIn):
    RecursiveProcess(ListIn, len(ListIn)-2) #this will change the list in place!
    return ListIn

所有这一切都让它像预期的那样运作。因为每个元素都在" recursion"中更新。所以不需要将指针传递给周围的列表。结果也是预期的结果:

# [59, 54, 44, 33, 27, 20, 19, 17, 13, 7]

答案 2 :(得分:0)

在一般情况下,你不会回来。尝试:

def RecursiveProcess(ListIn2, target): 
    if target > -1:
        ListIn2[target] = ListIn2[target] + ListIn2[target+1]  
        ListIn2 = RecursiveProcess(ListIn2, target-1) 
        return ListIn2 #Actually need to return in the general case
    else:
        return ListIn2