我试图使用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]))
答案 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]