递归函数python,创建一个函数,该函数生成具有相同和N的所有数字

递归函数python,创建一个函数,该函数生成具有相同和N的所有数字,python,recursion,Python,Recursion,我试图编写一个递归函数,该函数在python中生成所有的数字列表你可能需要重新考虑递归解,并考虑一个动态编程方法: def fn(N): ways = {0:[[]]} for n in range(1, N+1): for i, x in enumerate(range(n, N+1)): for v in ways[i]: ways.setdefault(x, []).append(v+[n])

我试图编写一个递归函数,该函数在python中生成所有的数字列表
def fn(v,n):
    N=5
    global vvi
    v.append(n) ;
    if(len(v)>N):
        return
    if(sum(v)>=5):
        if(sum(v)==5): vvi.append(v)

    else:
        for i in range(n,N+1):
            fn(v,i)
这是我得到的输出

vvi
Out[170]: [[1, 1, 1, 1, 1, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5]]   

我用C++尝试了同样的事情,它工作得很好,

你需要做的就是把它作为递归描述来实现。您希望将所有单例[j]预先添加到每个列表的和N-j中,除非N-j=0,其中还包括单例本身。如果翻译成python,这将是

def glist(listsum, minelm=1):
    for j in range(minelm, listsum+1):
        if listsum-j > 0:
            for l in glist(listsum-j, minelm=j):
                yield [j]+l
        else:
            yield [j]

for l in glist(5):
    print(l)
该解决方案包含一种机制,通过要求列表为非递减的方式排除置换解决方案,这是通过minelm参数完成的,该参数限制列表其余部分的值。如果不想包括置换列表,可以通过替换对glistlistsum-j的递归调用来禁用minelm机制

至于你的代码,我真的不明白你想做什么。很抱歉,您的代码不是很清楚,而且只有在python中这不是一件坏事,在C中更是如此

首先,通过全局变量从函数返回结果是一个坏主意,返回结果就是返回的目的,但是在python中,如果您希望在执行过程中返回多个元素,那么也可以得到很好的结果。对于递归函数,通过全局变量返回甚至使用它更可怕,因为您正在运行许多嵌套的函数调用,但只有一个全局变量

同时调用函数fn,将参数v和n作为参数。关于函数和它的参数,这实际上告诉了你什么?至多它是一个函数,可能其中一个参数应该是一个数字。如果其他人要阅读和理解代码,那么这不是很有用


如果你想更详细地回答你的代码的形式错误,你应该包括一个包含预期输出和可能被观察到的输出。

< P>你可能需要重新考虑递归解,并考虑一个动态编程方法:

def fn(N):
    ways = {0:[[]]}
    for n in range(1, N+1):
        for i, x in enumerate(range(n, N+1)):
            for v in ways[i]:
                ways.setdefault(x, []).append(v+[n])
    return ways[N]

>>> fn(5)
[[1, 1, 1, 1, 1], [1, 1, 1, 2], [1, 2, 2], [1, 1, 3], [2, 3], [1, 4], [5]]
>>> fn(3)
[[1, 1, 1], [1, 2], [3]]

使用全局变量和输入参数的副作用通常是考虑不好的练习,你应该避免使用.< /P> Python和C++是不同语法的不同语言。你能提供更多关于代码输入和各自输出的详细信息吗?包括你第一次如何调用递归函数这是输入vvi=[]对于范围5中的i:fn[],i和预期的输出?他正在使用一个全局变量来存储结果,这是一个可怕的错误practice@Adirio我没有意识到,但我同意这是可怕的-所以我更新了答案,指出我可以理解为他的解决方案是错误的。至少还有更重要的一点。您可能需要重新考虑您的arg name sum隐藏python内置代码通常不是一个好主意。@AChampion我意识到了这一点,但没有想出更好的名称,但可能listsum更好。然而,我并不是在所有情况下都同意这样做是一个很大的不允许。我相信我在我的帖子的第一句话中提到了这一点。如果只有元素amtter,而不是它们的顺序so+1,它实际上不会返回重复的解