试图以递归方式添加数字的平方

时间:2012-04-20 07:35:41

标签: python

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

6 个答案:

答案 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为它提供了必要的原语(分别为mapreduce),并且平方和可以简单地写成:

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

更多信息:mapfoldpartial 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)