python - 带递归的循环变量

标签 python recursion

想通过递归执行以下操作,以便我可以改变“for”循环的数量:

n = 5
out = []
for i in range(n):
    for j in range(i,n):
        for k in range(j,n):
            out.append([i,j,k])

返回

out =   [[0 0 0]
         [0 0 1]
         [0 0 2]
         [0 0 3]
         [0 0 4]
         [0 1 1]
         [0 1 2]
         [0 1 3]
         [0 1 4]
         [0 2 2]
         [0 2 3]
         [0 2 4]
         [0 3 3]
         [0 3 4]
         [0 4 4]
         [1 1 1]
         [1 1 2]
         [1 1 3]
         [1 1 4]
         [1 2 2]...]

例如

def Recurse(n, p):
  # where p is the number of for loops
  some magic recursion 
  return out

我看过其他一些递归问题,但很难找到解决方案。

最佳答案

不使用递归,而是使用 itertools.product() ,相当于生成器表达式中的嵌套 for 循环:

>>> import itertools
>>> list(itertools.product(range(3), repeat=2))
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
>>> list(itertools.product(range(3), repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)]

编辑: 没有意识到这实际上不是笛卡尔积,因为内部循环使用外部变量来开始范围,这是一种可能性,但效率不如它可能是因为它会生成额外的值并需要检查每个值是否有效:

def nested_loops(n, num_loops):
    prod = itertools.product(range(n), repeat=num_loops)
    for item in prod:
        if all(item[i] <= item[i+1] for i in range(num_loops-1)):
            yield item

>>> list(nested_loops(3, 2))
[(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]
>>> list(nested_loops(3, 3))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 1), (0, 1, 2), (0, 2, 2), (1, 1, 1), (1, 1, 2), (1, 2, 2), (2, 2, 2)]

关于python - 带递归的循环变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12848165/

相关文章:

java - 如何使用递归构建嵌套链表?

java - XSLT 处理递归深度

string - 如何在Powershell中搜索多个文件中的字符串并返回文件名?

python - 在 Pyramid 中,使用存储数据库连接的 python 全局变量是否安全?

python - PyDev 无法识别 Celery 任务装饰器

python - scipy.optimize.curve_fit 无法拟合偏移的倾斜高斯曲线

python - PYQT:QSqlTableModel。如何过滤数字而不是文本

python - Pandas 数据框列中的成员资格测试

java - 零阶乘递归返回 1

java - 为什么我们在计算递归过程的空间复杂度时不考虑堆栈帧的大小?