我正在创建一个包含数组中所有元素的乘法表,例如将所有元素(2,3,7,8,10)与第一个元素(2)相乘。然后,将新值(4,6,14,16,20)与第二个元素(3)相乘,以此类推。
我可以用一个循环相对简单地达到这个结果。
def multiplication(arr):
newArr = arr.copy()
for j in range(len(arr)):
newArr= [val*arr[j] for val in newArr]
return newArr
print(multiplication([2,3,7,8,10]))
但是当我尝试递归地解决它时,我无法保留具有相乘值的原始元素。
def multiplicationRecursively(arr, index=0):
if (index >= len(arr)):
return arr
arr = [val*arr[index] for val in arr]
return multiplicationRecursively(arr, index+1)
print(multiplicationRecursively([2,3,7,8,10]))
我做错了什么吗?我想我需要弄清楚如何保留原始数组来获得正确的乘数?我正在学习递归编程,所以我不愿意使用可能内置的方法。
生成的数组就是原始数组的所有元素与原始数组的每个元素的乘法。所以我们可以这样写一个递归:
def multiplicationRecursively(arr, mulitplier, index=1):
if (index <= len(arr) -1):
mulitplier = mulitplier * arr[index]
return multiplicationRecursively(arr, mulitplier, index+1)
return [mulitplier*val for val in arr]
print(multiplicationRecursively([2,3,7,8,10], 2))
这是一个有点疯狂的答案,但我认为问题是你不再乘以每个值与原始值的事实。
def multiplicationRecursively(arr: list, original = None, i = 0):
if not original:
return multiplicationRecursively(arr, arr.copy())
# Here is the base case
if (i == len(arr)):
return arr
newArr = [v * original[i] for v in arr]
return multiplicationRecursively(newArr, original, i + 1)
print( multiplicationRecursively( [2, 3, 7, 8, 10] ))
使用此方法,您将保留原始乘数,并最终得到相同的结果。
这显然不是最好的递归方式
我完全理解你所面临的问题,使用这段代码,你会得到预期的结果。
def multiplication_table(array, index = 0):
multiplier = array.copy()
if (index >= len(array)):
return ("")
else:
multipling_number = multiplier[index]
table =[multipling_number*i for i in array]
print (table, end='n')
return multiplication_table(array, index+1)
Test:
array=[1,2,3,4,5]
print(multiplication_table(array))
output:
[1, 2, 3, 4, 5]
[2, 4, 6, 8, 10]
[3, 6, 9, 12, 15]
[4, 8, 12, 16, 20]
[5, 10, 15, 20, 25]