使用递归时,列表不会添加任何新元素

时间:2018-11-11 11:26:15

标签: python list recursion

在使用递归时,要求我定义一个函数,该函数接受一个列表并返回另一个列表。但是,当我运行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]))

4 个答案:

答案 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]))