1

我需要编写一个程序,从带有 def 的数字列表中计算累积和,但只能使用递归。我做到了,但现在我需要在不使用方法的情况下编写相同的程序sum,但到目前为止还没有成功。任何的想法?

我的代码:

def rec_cumsum(numbers):
        ''' Input: numbers - a list of numbers,
                Output: a list of cumulative sums of the numbers'''
        if len(numbers)==0: return numbers

        return rec_cumsum(numbers[:-1])+ [sum(numbers)]

输入:

1 [1,2,3]

2 [2, 2, 2, 3]

输出:

1 [1,3,6]

2 [2, 4, 6, 9]


我的代码没有sum

def rec_cumsum(numbers):
        ''' Input: numbers - a list of numbers,
                Output: a list of cumulative sums of the numbers'''
        if len(numbers) == 0: return numbers
        my_list=[]
        rec_cumsum(my_list + numbers)
        my_list[0]=numbers[0]
        rec_cumsum(my_list)
        temp_sum=my_list[0]+numbers[-1]
        my_list[0]=temp_sum
        return my_list
4

3 回答 3

3

我会建议这样的事情而不添加额外的参数:

[更新]

def rec(n):
    if len(n) < 2: return n
    n[1] = n[0] + n[1]
    return [n[0]] + rec(n[1:])


print rec([1,2,3,4])
[1, 3, 6, 10]
于 2012-11-12T16:58:21.263 回答
2

你可以做的是: -

  • 创建一个临时列表(一个空的)。
  • 在您的方法中传递您的原始列表和空列表。
  • 现在,当您第一次传递您的列表时,只需将原始列表中的第一个元素添加到它。并使用列表的其余部分调用相同的方法。从第一个元素开始。
  • 当您的方法在病房后被调用时,您需要获取您的元素和现在修改的原始列表的last元素之temp list和。first element并将总和作为新元素添加到您的临时列表中。
  • 最后,当原始列表的长度变为 0 时。返回您的临时值。

**这是上述步骤的代码。你可以将它与你已经实现的进行比较,看看你哪里出错了:-

def rec_cumsum(numbers):
    if len(numbers) == 0 : return temp

    # You need to check, if `temp` is empty, that means method is called first time.
    if not temp:   
        temp.extend([numbers[0]])   // Just add the first element to it.

    else:
        # Else, get the last element from `temp`, 
        # add it to `first elemt` in `numbers` and add it to `temp`.
        temp.extend([temp[-1] + numbers[0]])

    return rec_cumsum(numbers[1:])

my_list = [2, 2, 2, 3]
temp = []
print rec_cumsum(my_list)
于 2012-11-12T16:34:31.967 回答
2

另一个解决方案是:

def rec(n):
    if len(n) < 2: return n
    rest = rec(n[:-1])
    return rest + [rest[-1] + n[-1]]

这个对我来说感觉更直观..

于 2012-11-16T20:55:00.400 回答