Python 递归函数不返回列表

Python Recursive Function not returning list

只是使用 python3 练习算法教科书中的一些作业。该函数应该读取 list/array 个整数和 return 个新的 list/array 偶数。我觉得我的实现是正确的,但它并没有像我期望的那样 returning 列表。

这是我的函数,并对其进行了快速测试。我打印出数组的长度,因为它是 returned (6),然后在调用函数时立即打印长度 (None)

def even_array(array1, new_array=[], index=0):
    if index >= len(array1):
        print(len(new_array))
        return new_array
    else:
        if(array1[index] % 2) == 0: #this is an even number
            new_array.append(array1[index])
        even_array(array1, new_array, index + 1)


int_array = [1,2,3,4,5,5,6,99,102,104,22]

new_array = even_array(int_array)
print(len(new_array))

new_array = even_array(int_array)
for element in new_array:
    print(element)

这是我第一次 post 在这里,所以任何关于格式或我应该包含多少信息的反馈都非常感谢:)

您的 else 案例缺少 return 语句,因此未返回值。

def even_array(array1, new_array=[], index=0):
    if index >= len(array1):
        print(len(new_array))
        return new_array
    else:
        if(array1[index] % 2) == 0: #this is an even number
            new_array.append(array1[index])
        return even_array(array1, new_array, index + 1)

旁注:不要将空数组作为默认参数传递,这是引入难以调试问题的简单方法。阅读 this 答案以获得更清晰的答案。

你的想法很好,但是在执行过程中遇到了一些问题。

  1. 您在 else 分支中缺少 return 语句;
  2. 您正在修改列表参数。这将使事情难以遵循,因为它将保留所有递归调用所做的所有更改。这通常是要避免的。

可能的修复:

def even_array(array1, new_array=[], index=0):
    if index >= len(array1):
        print(len(new_array))
        return new_array
    else:
        if(array1[index] % 2) == 0: #this is an even number
            return even_array(array1, new_array + [array1[index]], index + 1)

在这种情况下,您也可以使用 .append 来完成,因为在递归调用之后没有其他任何事情要做。例如,如果有另一个递归调用,您可能需要进行相应的 .pop 调用。但如果可能,请避免像这样改变列表参数。