【问题标题】:Python converting recursive permutation function to iterativePython将递归置换函数转换为迭代
【发布时间】:2019-04-04 02:37:57
【问题描述】:

我有一个未知数量的整数变量,它们的范围可以从 [0,9] 我想遍历这些值的所有排列。

如果变量的数量是恒定的,那么编写嵌套的 for 循环会很容易。我想出了一个递归函数,可以做我想做的事,但很好奇是否有办法迭代地做。

def nested(array,index):
    n = len(array)
    for i in range(10):
        array[n-index]=i
        #len(array-1) end of array
        if(index == 1):
            print(array)
            #do something later
        else:
            nested(array,index-1)

#generate all permutations, change n to change size of list.            
n = 4
array = [0]*n
nested(array,len(array))

我尝试使用此处找到的所谓“简单方法”-> http://blog.moertel.com/posts/2013-05-11-recursive-to-iterative.html 但我无法让它工作。

【问题讨论】:

  • 请在您链接的博客中更具体地说明哪些内容不起作用。据我所知,这篇文章很好地涵盖了迭代到递归,请努力更新问题。
  • 这里没有真正的“秘密”。该博客文章中解释的大部分内容适用于线性递归算法(在链表中搜索项目),而不是分支递归算法(在图中搜索路径)。排列问题是后者(一棵树)。将这种形式的递归算法转换为迭代版本的最简单方法是使用堆栈/队列数据结构。从堆栈中弹出一个元素。对其进行操作。将分支节点推到上面。堆栈为空时退出。
  • ... 例如,从这里比较深度优先搜索的递归和迭代伪代码。 en.m.wikipedia.org/wiki/Depth-first_search

标签: python recursion iteration


【解决方案1】:

正如另一位评论者所提到的,关键是使用堆栈来模拟尾递归。

注意 I append()(array, index) 的元组到 stack 中,这反映了原始递归解决方案中对递归函数的调用。在迭代开始时,它执行stack.pop(),它模仿了递归函数的主体。递归调用变为stack.append()

def nested(array):
    stack = []
    n = len(array)
    stack.append((array.copy(), n))
    while(stack):
        array, index = stack.pop()        
        for i in range(10):
            array[n-index]=i
            #len(array-1) end of array
            if(index == 1):
                print(array)
                #do something later
            else:
                stack.append((array.copy(), index-1)) 

#generate all permutations, change n to change size of list.            
n = 4
array = [0]*n
nested(array)

【讨论】:

    【解决方案2】:

    请参考itertools。有一个类“排列”可以完美解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-08
      • 2015-05-30
      • 2014-03-01
      相关资源
      最近更新 更多