当前位置: 首页 > 知识库问答 >
问题:

当存在递归时保留局部变量的当前值

叶淇
2023-03-14

我正在编写一个函数来展平嵌套数组(Pythonlist)。例如将[1,2,[3]]变成[1,2,3],[[1,2,[3]],4]变成[1,2,3,4]等。

我有以下内容:

def flatten_array(array):
    flattened_array = []
    for item in array:
        if not isinstance(item, list):
            flattened_array.append(item)
        else:
            flatten_array(item)
    return flattened_array

所以这个想法是让函数是递归的,以处理嵌套到未知深度的情况。我的问题是flattened_array每次遇到嵌套列表都会被重新初始化(当flatten_array被递归调用时)。

print flatten_array([1,2,[3]])
[1,2]

在进行递归调用时,如何保持展平数组的状态?

共有1个答案

丘友樵
2023-03-14

更改线条

else:
    flatten_array(item)

else:
    flattened_array+=flatten_array(item)

所以完整函数的内容如下

def flatten_array(array):
    flattened_array = []
    for item in array:
        if not isinstance(item, list):
            flattened_array.append(item)
        else:
            flattened_array+=flatten_array(item)
    return flattened_array

这给

flatten_array([1,2,[3]]) # [1,2,3]
flatten_array([1,2,[3,[4,5]]]) # [1,2,3,4,5]
flatten_array([1,2,[3,[4,5]],6,7,[8]]) # [1,2,3,4,5,6,7,8]

您的原始代码对递归调用没有任何作用。您可以在列表中取回结果,但只需丢弃它。我们要做的是将其附加到现有列表的末尾。

此外,如果您不想继续创建临时数组,我们可以在第一次调用函数时创建一个数组,然后附加到它。

def flatten_array(array,flattened_array=None):
    if flattened_array is None:
        flattened_array = []
    for item in array:
        if not isinstance(item,list):
            flattened_array.append(item)
        else:
            flatten_array(item,flattened_array)
    return flattened_array

此版本的结果是相同的,可以以相同的方式使用,但在原始版本中,对函数的每次调用都会创建一个新的空数组来使用。通常这不是问题,但这取决于深度或子数组在内存中的大小。

此版本将阵列展平为给定阵列。仅使用输入调用时(如展平数组([1,2,[3])),它会创建一个空数组来处理,否则它只会添加到给定的数组中(因此递归调用只需要提供要添加的数组),并在适当的位置对其进行修改

如果我们需要,这具有允许您添加到现有数组的优势:

a = [1,2,3]
b = [2,3,[4]] # we want to add flatten this to the end of a
flatten_array(b,a) # we don't bother catching the return result here
print(a) # [1,2,3,2,3,4]

这可能不是我们想要的。通过将默认值设置为“无”,并每次在函数中创建一个新的空数组,我们可以确保对函数的每次调用都有一个唯一的空数组。

 类似资料:
  • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引文来回答。 我有以下递归方法: 在本例中,当我调用其中的方法时,以及使用方法I时,会再次创建parentUuids,并且会丢失其值。 另一方面,当使用如下所示的方法II时,我保留了值: 我的问题是: 1.方法II是保留局部变量值的正确方法吗? 2.这是一种特殊的用法吗?它叫什么名字?我以前从未使用过这种方法,但我认为它可能对这种情况有用。

  • 函数甚至可以不使用局部变量来调用自己. 例子 23-14. 汉诺塔 1 #! /bin/bash 2 # 3 # 汉诺塔(The Towers Of Hanoi) 4 # Bash script 5 # Copyright (C) 2000 Amit Singh. All Rights Reserved. 6 # http://hanoi.kernelthrea

  • 所以,如果我调用fact(3),那么每个调用结果变量将在堆栈中获得单独的内存? (如果这是一个愚蠢的问题,很抱歉,但我似乎无法掌握这个概念。)

  • 即使不适用局部变量,函数也可以递归的调用自身。 例子24-16. 斐波那契序列 #!/bin/bash # fibo.sh : 斐波那契序列 (递归) # 作者: M. Cooper # License: GPL3 # ----------算法-------------- # Fibo(0) = 0 # Fibo(1) = 1 # else # Fibo(j) = Fibo(j-1) + Fi

  • 所以我正在用Visual Studio编写一个Android应用程序。我想要一个既有纵向又有横向的活动。当我打开我的设备时,我的活动中的数据消失了。所以我在网上查了一下,找到了一行放在清单中的数据,这很有效!Android:config changes = " orientation | keyboard hidden | screen size "除了我所有的视图都是无序的、错位的。我使用了两种