我试图通过尝试我儿子在大学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
答案 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