关于python:使用递归时,list不会添加任何新元素

While using recursion, list won't add any new elements

我被要求定义一个函数,它接受一个列表并返回另一个列表,所有这些都是在使用递归时完成的。但是,当我运行else命令并打印lst_时,输出显示每次运行时,列表都包含一个元素,而不是一个接一个地添加double。我还尝试不使用append()思想吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def double(lst, lst_ = []):
   """
    parameters : lst of type list;
    returns : another list with lst's elements doubled
   """

    if len(lst) == 0:
        return lst_
    else:
        lst[0] = int(lst[0]) + int(lst[0])
        lst_ = lst_ + lst[0:1]            
        print(lst_)
        return double(lst[1:])

print(double([1,2,3,4,5,6,7,8]))

这是输出

1
2
3
4
5
6
7
8
9
[2]
[4]
[6]
[8]
[10]
[12]
[14]
[16]
[]


如果要返回副本而不修改原始副本,我不建议使用可变的默认参数。

相反,

1
2
3
4
def double(lst):
    if not lst:
        return []
    return [2*lst[0], *double(lst[1:])] # [2*lst[0]] + double(lst[1:])

递归事例必须返回一个新列表,并且基本事例将检查并返回一个空列表。

1
2
3
lst1 = double([1,2,3,4,5,6,7,8])
print(lst1)
[2, 4, 6, 8, 10, 12, 14, 16]

如果您想玩得开心一点,可以使用yield from尝试基于生成器的递归解决方案(生成器委派):

1
2
3
4
5
6
7
8
def double(lst):
    if lst:
        yield 2*lst[0]
        yield from double(lst[1:])

lst = list(double([1,2,3,4,5,6,7,8]) )
print(lst)
[2, 4, 6, 8, 10, 12, 14, 16]

如果不想使用append()。然后您可以使用此解决方案:

1
2
3
4
5
6
7
def double(lst, lst_ = []):
    if not lst:
        return lst_
    else:
        return [lst[0] * 2 , *double(lst[1:])]

print(double([1,2,3,4,5,6,7,8]))

输出为:[2, 4, 6, 8, 10, 12, 14, 16]

只是为了防止您对*double(lst[1:])调用感到疑惑:使用*[]解包参数列表。在这里阅读更多。如果不使用*进行调用,将得到如下输出:

1
[2, [4, [6, [8, [10, [12, [14, [16, []]]]]]]]]

另一个简单的解决方案是:

1
2
3
4
5
6
7
8
9
def double(lst, lst_ = []):
    if not lst:
        return lst_
    else:
        lst[0] = lst[0] * 2
        lst_ = lst_.append(lst[0])
        return double(lst[1:])

print(double([1,2,3,4,5,6,7,8]))


使用列表中的EDOCX1[0]在末尾添加元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def double(lst, lst_ = []):
   """
    parameters : lst of type list;
    returns : another list with lst's elements doubled
   """

    if len(lst) == 0:
        return lst_
    else:
        lst[0] += lst[0]
        lst_.append(lst[0])          
        return double(lst[1:])

print(double([1,2,3,4,5,6,7,8]))
# [2, 4, 6, 8, 10, 12, 14, 16]

另外,请注意,代码中的这一行lst[0] = int(lst[0]) + int(lst[0])可以缩短为lst[0] += lst[0],因为您只处理整数,而显式转换是多余的。


尝试这种方式:

1
2
3
4
5
6
7
8
9
10
11
def double(lst, lst_ = []):
  if len(lst) == 0:
    return lst_
  else:
    lst[0] = int(lst[0]) + int(lst[0])
    lst_.extend(lst[:1])
    return double(lst[1:])

print(double([1,2,3,4,5,6,7,8]))

#=> [2, 4, 6, 8, 10, 12, 14, 16]