3 回答
TA贡献1854条经验 获得超8个赞
如果想法是在不修改原件的情况下返回副本,我不建议使用可变默认参数。
反而,
def double(lst):
if not lst:
return []
return [2*lst[0], *double(lst[1:])] # [2*lst[0]] + double(lst[1:])
递归案例必须返回一个新列表,基本案例将检查并返回一个空列表。
lst1 = double([1,2,3,4,5,6,7,8])
print(lst1)
[2, 4, 6, 8, 10, 12, 14, 16]
如果你想找点乐子,你可以尝试使用yield from(生成器委托)基于生成器的递归解决方案:
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]
TA贡献1806条经验 获得超8个赞
如果您不想使用 append()。然后你可以使用这个解决方案:
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:]) 调用感到疑惑: *[] 用于解包参数列表。在这里阅读更多。 如果您在没有 * 的情况下调用,您将得到如下输出:
[2, [4, [6, [8, [10, [12, [14, [16, []]]]]]]]]
另一个简单的解决方案是:
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]))
TA贡献1831条经验 获得超9个赞
使用.append()on list 在末尾添加元素:
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],因为您只处理整数并且显式转换是多余的。
添加回答
举报