首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个循环解决方案可以用递归吗?

这个循环解决方案可以用递归吗?
EN

Software Engineering用户
提问于 2014-08-12 16:18:49
回答 2查看 277关注 0票数 2

最后,我想把这个解决方案推广到任意长度的元组中。我认为递归是必要的,但我一直无法做到。

代码语言:javascript
运行
复制
def combineRanges(maxValues) :
    for x in range(0, maxValues[0]) :
        for y in range(0, maxValues[1]) :
            for z in range(0, maxValues[2]) :
                print (str(x) + '-' + str(y) + '-' + str(z));

m = (6,9,20);    
combineRanges(m);

http://repl.it/WiZ

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2014-08-12 16:29:39

这里不需要递归;您可以使用itertools.productmap和tuple解包:

代码语言:javascript
运行
复制
from itertools import product

def combine_ranges(max_values):
    for t in product(*map(range, max_values)):
        print("-".join(map(str, t)))

一个简短的例子:

代码语言:javascript
运行
复制
>>> combine_ranges((2, 2, 2, 2))
0-0-0-0
0-0-0-1
0-0-1-0
0-0-1-1
0-1-0-0
0-1-0-1
0-1-1-0
0-1-1-1
1-0-0-0
1-0-0-1
1-0-1-0
1-0-1-1
1-1-0-0
1-1-0-1
1-1-1-0
1-1-1-1

注意佩普-8-compliant名称的使用。

票数 6
EN

Software Engineering用户

发布于 2014-08-12 18:08:28

递归并不是必需的,但它是执行未知级别嵌套循环的最清晰的方法之一。在输入元组中,每个元素只使用一个级别的堆栈,因此您有相当大的喘息空间。

对于递归函数,您需要一个基本案例和一个递归案例。基本情况是元组中有零个元素,这就是打印结果的地方。递归的情况是执行每个嵌套循环并将结果附加到下面的级别。

代码语言:javascript
运行
复制
def combineRanges(maxValues, result=()):
  if len(maxValues) is 0:
    print("-".join(result))
    return

  for x in range(0, maxValues[0]):
    combineRanges(maxValues[1:], result + (str(x),))

每个递归调用从maxValues前面提取一个元素,并向result元组添加一个结果,直到maxValues为空。这种类型的递归有点棘手,因为您在一个参数中积累了结果,但是这种模式非常有用,而且出现了很多,因此值得学习。而且,python的列表不是不变的,这就是为什么我使用tuple来保存结果的原因。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/253077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档