如何使用递归计算2个列表的点积?



在学校,我有这个练习,我必须使用递归计算两个列表的点积。如果两个字符串长度不等,或者列表中没有任何内容,则返回0。这是我目前所看到的:

def dot(L, K):
if len(L) != len(K):
return 0
elif len(L) or len(K) == 0:
return 0
else:

输出必须像这样:

In [1]: dot([5, 3], [6, 4])
Out[1]: 42.0

所以5 * 6 = 30和3 * 4 = 12 = 42。

有人能帮我一下吗?

尝试:

def dot(k, l):
if len(k) != len(l) or len(k) == 0:
return 0
else:
return _dot(k, l, 0)
# recursive helper function that accumulates the total sum
def _dot(k, l, total):
if k and l:
total += k[0] * l[0] 
return _dot(k[1:], l[1:], total)
else:
return total
# tests
assert dot([5, 3], [6, 4]) == 42
assert dot([1,0], [1]) == 0
assert dot([1], [1, 2]) == 0
assert dot([], []) == 0

这里是一个详细的答案,希望能帮助你理解递归的逻辑。

def helper(x, y, idx, n, curr):
i = x[idx]
j = y[idx]
tmp = i * j
res = curr + tmp
if idx == n - 1:  # checks to see if we are at the end of the array
return res
else:
return helper(x, y, idx + 1, n, res)

def dot(k, l):
if len(k) != len(l):
return 0
elif not len(k):
return 0
else:
return helper(k, l, 0, len(k), 0)

我们连续滑动数组,跟踪索引。我们在每次迭代中检查我们是否到达了数组的末尾,也就是len(array) - 1。如果到达末尾,则返回结果,否则继续沿着数组向下,将当前索引加1。

尝试:

def dot(L, K):
if len(L) == 0 or len(L) != len(K):
return 0
else:
return L[0] * K[0] + (0 if len(L) == 1 else dot(L[1:], K[1:]))

assert dot([5, 3], [6, 4]) == 42
assert dot([1, 0], [1]) == 0
assert dot([1], [1, 2]) == 0
assert dot([], []) == 0

让我们通过抛弃那些不必要的else语句来简化这段代码,并在我们使用它时去掉total参数:

def dot(k, l):
def dot_recursive(k, l):
if k:  # k and l are same length
return k[0] * l[0] + dot_recursive(k[1:], l[1:])
return 0
if (length := len(k)) == 0 or length != len(l):
return 0
return dot_recursive(k, l)
assert dot([5, 3], [6, 4]) == 42
assert dot([1, 0], [1]) == 0
assert dot([1], [1, 2]) == 0
assert dot([], []) == 0

最新更新