在使用递归时,要求我定义一个函数,该函数接受一个列表并返回另一个列表。但是,当我运行else命令并打印lst_
时,输出显示每次运行时列表都包含一个元素,而不是将双精度元素一一添加。此外,我尽量不要使用{{1 }}有想法吗?
append()
这是输出
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]))
答案 0 :(得分:1)
如果要在不修改原始文档的情况下返回副本,则不建议使用可变的默认参数。
相反,
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]
答案 1 :(得分:0)
尝试这种方式:
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]
答案 2 :(得分:0)
使用列表上的.append()
在末尾添加元素:
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]
,因为您只处理整数,而显式强制转换是多余的。
答案 3 :(得分:0)
如果您不想使用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:])调用:* []用于解压缩参数列表。 Read more here. 如果您拨打不带*的电话,您将得到如下输出:
[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]))