While using recursion, list won't add any new elements
我被要求定义一个函数,它接受一个列表并返回另一个列表,所有这些都是在使用递归时完成的。但是,当我运行else命令并打印
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] |
如果您想玩得开心一点,可以使用
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])) |
输出为:
只是为了防止您对*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] |
另外,请注意,代码中的这一行
尝试这种方式:
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] |