0
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,即使它应该是最后一个要平方并添加到 sum 的数字。

4

6 回答 6

6
def recursive_add(s):
    if s:
        return s[0]**2 + recursive_add(s[1:])
    else:
        return 0
于 2012-04-20T07:58:07.897 回答
3

首先,针对您的特定问题的单线解决方案:

def rec_add(s):
    return s[0] * s[0] + rec_add(s[1:]) if s else 0

接下来是更高级和抽象的东西。

在函数式编程术语中,您将 x**2 “映射”到一个列表上,并通过将其元素添加在一起来“折叠”该列表。Python为此提供了必要的原语(mapreduce分别),平方和可以简单地写成:

from operator import add, mul

xs = [1,2,3,5]
print reduce(add, map(mul, xs, xs)) # 39

您还可以将 map 和 fold 步骤组合在一个函数中:

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

更多信息:mapfoldpartial application

于 2012-04-20T08:16:46.030 回答
2

你可以:

def recursive_add(s):
    return s and (recursive_add(s[1:]) + s[0]**2) or 0

在您的原始代码中,问题似乎recursive_add(s[1:])sum. s是不同的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)
于 2012-04-20T07:41:01.697 回答
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

如您所见,您的函数确实成功地将第一个数字从列表中剪掉,并递归调用自身,直到它处理完所有数字。但问题是您不断将 sum 重新设置为 0,因此 sum 并没有累积实际总和;所以你的最终答案是 0 + 64,或者只是 64。

于 2012-04-20T08:16:53.723 回答
1

答案很简单,只需在 else 部分添加 recursive-add(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))
于 2020-06-02T06:34:17.433 回答
0

你的代码不是你想要的。首先,声明sum = 0recursive_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)
于 2012-04-20T07:42:02.587 回答