def recursive_add(s):
sum = 0
if len(s) == 1:
sum += s[0] ** 2
else:
recursive_add(s[1:])
sum += s[0]**2
return sum
s = [8, 6, 8, 4]
print recursive_add(s)
然而,出于某种原因,8立即得到平方并返回64,即使它应该是最后一个被平方并加到总和的数字。
答案 0 :(得分:6)
def recursive_add(s):
if s:
return s[0]**2 + recursive_add(s[1:])
else:
return 0
答案 1 :(得分:3)
首先,针对您的具体问题的单线解决方案:
def rec_add(s):
return s[0] * s[0] + rec_add(s[1:]) if s else 0
更高级和抽象的东西如下。
在函数式编程术语中,您在列表中“映射”x ** 2并通过将其元素添加到一起来“折叠”列表。 Python为它提供了必要的原语(分别为map
和reduce
),并且平方和可以简单地写成:
from operator import add, mul
xs = [1,2,3,5]
print reduce(add, map(mul, xs, xs)) # 39
您还可以在一个函数中组合地图和折叠步骤:
def map_and_fold(xs, mapfun, foldfun, init):
if not xs:
return init
return foldfun(
mapfun(xs[0]),
map_and_fold(
xs[1:], mapfun, foldfun, init))
并将sum_squares
定义为上述部分应用程序:
from functools import partial
sum_squares = partial(map_and_fold,
mapfun = lambda x: x * x,
foldfun = lambda x, y: x + y,
init = 0)
测试:
xs = [1,2,3,5]
print sum_squares(xs) # 39
更多信息:map,fold,partial application。
答案 2 :(得分:2)
你可以:
def recursive_add(s):
return s and (recursive_add(s[1:]) + s[0]**2) or 0
在原始代码中,问题似乎是recursive_add(s[1:])
与sum
不共享recursive_add(s)
。 sum
是不同的。试试这个:
sum = 0
def recursive_add(s):
global sum
if len(s) == 1:
sum += s[0] ** 2
else:
recursive_add(s[1:])
sum += s[0]**2
s = [8, 6, 8, 4]
print recursive_add(s)
答案 3 :(得分:1)
当您试图找出您的程序无法正常工作的原因时,最好弄清楚 正在做什么。以下是如何修改程序以显示其实际功能的示例。
def recursive_add(s):
print "DEBUG: recursive_add(%s)" % repr(s)
sum = 0
print "DEBUG: sum: %d" % sum
if len(s) == 1:
sum += s[0] ** 2
print "DEBUG: sum: %d" % sum
else:
recursive_add(s[1:])
sum += s[0]**2
print "DEBUG: sum: %d" % sum
return sum
s = [8, 6, 8, 4]
print "result: %d" % recursive_add(s)
当你运行它时,这就是你得到的:
DEBUG: recursive_add([8, 6, 8, 4])
DEBUG: sum: 0
DEBUG: recursive_add([6, 8, 4])
DEBUG: sum: 0
DEBUG: recursive_add([8, 4])
DEBUG: sum: 0
DEBUG: recursive_add([4])
DEBUG: sum: 0
DEBUG: sum: 16
DEBUG: sum: 64
DEBUG: sum: 36
DEBUG: sum: 64
result: 64
正如您所看到的,您的函数确实成功地从列表中剪切了第一个数字,并以递归方式调用自身,直到它处理完所有数字。但问题是你将总和重新设置为0,所以总和不会累积实际总和;所以你的最终答案是0 + 64,或者只是64。
答案 4 :(得分:1)
答案很简单,只需将递归加(s [1:])加到其他部分中即可:
def recursive_add(s):
sum = 0
if len(s) == 1:
sum += int(s[0]) ** 2
else:
sum = sum+int(s[0])**2+recursive_add(s[1:])
return sum
s = [8, 6, 8, 4]
print (recursive_add(s))
答案 5 :(得分:0)
您的代码不是您想要的。
首先,将sum = 0
声明为recursive_add
会导致与您期望的行为不同。
我建议在
中修改它def recursive_add(s,sum):
if len(s) == 1:
return sum + s[0] ** 2
else:
sum = s[0] ** 2 + recursive_add(s[1:],sum)
return sum
以这种方式称呼它
s = [8, 6, 8, 4]
print recursive_add(s,0)