在Python中将递归函数更改为迭代函数

时间:2018-11-03 16:16:10

标签: python recursion

我读到您可以将任何递归函数转换为迭代函数。我有一个迭代函数,可从此处显示的嵌套列表中获取值:

filled_list = [1,2,3,[1,2,3,[1,2,3,[1,2,3,4]]]]

递归函数:

def recursive_list(value, count):
    x, _, _, _d = value
    if not count%2:
        yield x
    yield from ([] if not isinstance(_d, list) else recursive_list(_d, count+2))
x = recursive_list(filled_list, 0)
print(list(x), "Parsing a list recursively.")

输出:[1、1、1、1]递归解析列表。

我正在尝试将其转换为迭代函数。这是我到目前为止所拥有的。我陷入困境,不知道如何遍历每个嵌套列表,直到到达末尾。输出应与递归函数相同。

def iterative_list(value):
    value_list = []
    for a in value:
        for _d in value:
            a, _, _, _d = value
            y, _, _, _d = _d
            value_list.append(a)
            value_list.append(y)
    return value_list
z = iterative_list(filled_list)
print(z, "Parsing a list iteratively.")

1 个答案:

答案 0 :(得分:1)

假设您的输入将始终遵循相同的模式,即三个整数,然后是一个列表,则可以简单地使用while循环:

def get_first(d): 
  while isinstance(d[-1], list):
    a, *_, d = d
    yield a
  yield d[0]

print(list(get_first([1,2,3,[1,2,3,[1,2,3,[1,2,3,4]]]])))

输出:

[1, 1, 1, 1]

时间:

import time

def timeit(f):
  _start = time.time()
  _ = list(f([1,2,3,[1,2,3,[1,2,3,[1,2,3,4]]]]))
  print(f'{f.__name__} finished in {time.time()-_start} seconds')

@timeit
def get_first_iterative(d): 
  while isinstance(d[-1], list):
    a, *_, d = d
    yield a
  yield d[0]

@timeit
def get_first_recursive(d):
  def recursive_list(value):
     x, _, _, _d = value
     yield x
     yield from ([] if not isinstance(_d, list) else recursive_list(_d))
  return recursive_list(d)

输出:

get_first_iterative finished in 2.7894973754882812e-05 seconds
get_first_recursive finished in 1.7881393432617188e-05 seconds

虽然从上述时序来看,递归解决方案比迭代解决方案要快,但事实并非如此,因为每个解决方案的时序对数据的深度最大为100,这表明:

enter image description here

以上情节的源代码可以在here

中找到