【发布时间】:2013-06-30 09:03:04
【问题描述】:
为了提高速度,我需要转换这段 python 代码。 r 和 n 是用户定义的整数变量。
该函数应该生成具有以下条件的所有列表:
listSum = n, length = r, 值(有替换)在 [0,1,2,...,n]
def recurse(r,n):
if r == 1:
yield [n]
return
for i in range(n+1):
for j in recurse(r-1,n-i):
yield [i]+j
我尝试使用静态变量,但它们在不正确的时间递增。我试图从主函数中更改我需要的变量(r、n 和 i)并将它们传递给我的生成器等效函数,但这个解决方案似乎不适用于 r 和 n 的不同初始值。我正在使用未安装 Boost 的系统,并且我没有安装它的系统权限。那么如何将递归 python 列表生成器转换为 C++?
当我迭代 recurse(r=3, n=4) 时,我得到:
[0, 0, 4]
[0, 1, 3]
[0, 2, 2]
[0, 3, 1]
[0, 4, 0]
[1, 0, 3]
[1, 1, 2]
[1, 2, 1]
[1, 3, 0]
[2, 0, 2]
[2, 1, 1]
[2, 2, 0]
[3, 0, 1]
[3, 1, 0]
[4, 0, 0]
【问题讨论】:
-
IMO,您不应该尝试将语言 A 翻译成语言 B(永远)。相反,从高层次上看这段代码在做什么,然后用目标语言实现它。尝试翻译通常会导致代码混淆。
-
Equivalent C++ to Python generator pattern 的可能副本 ...您还可以查看 Boost 的协程库,我非常不同意 @Borgleader,我认为有时追求对任何事物都有意义的习语是有意义的你想说的是,不管这个概念来自什么语言。也就是说,在这种特殊情况下,我认为您只需要一个迭代器。
-
这不只是对
itertools.combinations_with_replacement的重新实现吗?无论如何,组合的数量实在是太大了,所以即使在 C++ 中,如果输入足够大,你的代码也会“永远”循环。 -
实际上并没有那么大(我保持 r 和 n
标签: c++ python recursion generator translate