Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归累积和_Python - Fatal编程技术网

Python 递归累积和

Python 递归累积和,python,Python,我需要写一个程序,用def计算一系列数字的累积和,但只能用递归。 我做到了,但是现在我需要在不使用sum方法的情况下编写相同的程序,但是到目前为止没有成功。 有什么想法吗 我的代码: def rec_cumsum(numbers): ''' Input: numbers - a list of numbers, Output: a list of cumulative sums of the numbers''' if len(nu

我需要写一个程序,用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]

我的代码(无总和):

您可以做的是:-

创建一个临时列表和一个空列表。 在方法中传递原始列表和空列表。 现在,当您第一次传递列表时,只需将原始列表中的第一个元素添加到其中。并对列表的其余部分调用相同的方法。从第一个元素开始。 在wards之后调用方法时,需要获取临时列表的最后一个元素和现在修改的原始列表的第一个元素的总和。并将总和作为新元素添加到临时列表中。 最后,当原始列表的长度变为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)
您可以做的是:-

创建一个临时列表和一个空列表。 在方法中传递原始列表和空列表。 现在,当您第一次传递列表时,只需将原始列表中的第一个元素添加到其中。并对列表的其余部分调用相同的方法。从第一个元素开始。 在wards之后调用方法时,需要获取临时列表的最后一个元素和现在修改的原始列表的第一个元素的总和。并将总和作为新元素添加到临时列表中。 最后,当原始列表的长度变为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)

我建议这样做,但不添加其他参数:

[更新]

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]

我建议这样做,但不添加其他参数:

[更新]

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]

另一个解决办法是:

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

这对我来说更直观。

另一个解决方案是:

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


我觉得这个更直观。

@user1816377。。你能举个例子说明你想要什么吗。请发布示例输入和预期输出。看起来您的代码正常工作。问题是什么?您的问题是如何在不使用sum方法的情况下执行此操作?您需要以某种方式保持当前sum的运行总数。。。可能会将其作为可选参数传递;新代码中的问题:-1-您应该将数字传递给递归调用,而不是我的\u列表。第二,您仅在方法中声明了my_列表。声明它在我们这边。@user1816377。。你能举个例子说明你想要什么吗。请发布示例输入和预期输出。看起来您的代码正常工作。问题是什么?您的问题是如何在不使用sum方法的情况下执行此操作?您需要以某种方式保持当前sum的运行总数。。。可能会将其作为可选参数传递;新代码中的问题:-1-您应该将数字传递给递归调用,而不是我的\u列表。第二,您仅在方法中声明了my_列表。宣布它在我们这边。@JoranBeasley。。嗯。我要求OP进一步澄清。让我看看。如果这不是他想要的,我将更新我的答案。@RohitJain我的func只能得到一个参数,我必须保持这样。@user1816377。。然后修改代码,现在根据需要修改一些步骤。不要在方法中传递临时列表。试试看,应该可以。只传递一个数字作为第二个值。。。你可以选择第二个值。。。这样就不需要了,my_func[1,2,3]仍然可以正常工作。它应该会起作用。你只需要做一点修改。你应该尝试一下自己。@JoranBeasley。。嗯。我要求OP进一步澄清。让我看看。如果这不是他想要的,我将更新我的答案。@RohitJain我的func只能得到一个参数,我必须保持这样。@user1816377。。然后修改代码,现在根据需要修改一些步骤。不要在方法中传递临时列表。试试看,应该可以。只传递一个数字作为第二个值。。。你可以选择第二个值。。。这样就不需要了,my_func[1,2,3]仍然可以正常工作。它应该会起作用。你只需要做一点修改。一件小事是,如果你给空列表作为输入,这可能会失败,你可以尝试我所做的来避免+对于这个聪明的解决方案,一个小问题是,如果您将空列表作为输入,这可能会失败,您可以尝试我所做的来避免它+1.这个聪明的解决方案。。