递归地将列表中的每个元素相乘

时间:2018-10-24 17:38:12

标签: python recursion

我试图使用no循环递归地将python中列表A的每个元素乘以int k。到目前为止,我的代码是不正确的,因为它不会修改原始数组,而是创建一个副本A。我意识到我必须定义一个辅助函数multAllRec(k,A,i)来执行此操作,并且想知道如何进行此操作

def multAll(k,A):
    if A == []: 
        return 
    A[0] = A[0]*k      
    return multAll(k, A[1:])

print(multAll(10, [5,12,31,7,25]))

3 个答案:

答案 0 :(得分:2)

修改原稿

距离您不太远。您需要注意从递归调用返回的方式。

修改原始文件时,您的递归大小写将需要有所不同。只需乘以第一个元素并就地更新即可。在递归调用中传递整个列表。另外,让函数参数跟踪要修改的当前索引。

def multAll(A, i, k):
    if i < len(A):
        A[i] *= k
        multAll(A, i+1, k)

A = [5, 12, 31, 7, 25]
multAll(A, 0, 10)
print(A)
[50, 120, 310, 70, 250]

返回新列表

def multAll(A, k):
   if not A: 
       return []         
   return [A[0] * k] + multAll(A[1:], k)

print(multAll([5, 12, 31, 7, 25], 10))
[50, 120, 310, 70, 250]

从递归调用返回时,将第一个元素乘以k,将其列出,然后与对A[1:](也是一个列表)进行递归调用的结果连接起来。

在基本情况下,返回一个空列表。

答案 1 :(得分:1)

问题在于您正在使用A[1:]创建一个新数组。

def multAll(k,A, curr):
    if curr == len(A):
        return
    A[curr] = A[curr]*k
    return multAll(k, A, curr + 1)

AA = [5,12,31,7,25]
multAll(10, AA, 0)
print(AA)

答案 2 :(得分:0)

您非常亲密。返回函数的结果时,您忘记将当前迭代的结果附加到递归结果的前面:

def multAll(k,A):
    if len(A) == 0:
        return []
    return [A[0]*k] + multAll(k, A[1:])

print(multAll(10, [5,12,31,7,25]))

输出:

[50, 120, 310, 70, 250]