如何递归计算点积?解决递归实现中的无限递归问题
递归实现点积的问题解决
我需要编写一个递归计算点积的函数,目前已实现最多支持4维的非递归版本,但尝试递归实现时出现无限递归错误。我尝试调整递归深度限制,但无论设置多大的限制,都会提示限制过低。请问该如何解决这个问题?
原非递归代码
#Dot product not recursively def dot(L, K): """ Calculates dot product of lists L and K Empty lists or lists of unequal length return 0 L, K are floats or ints """ x = len(L) - 1 if len(L)!= len(K): return 0 if len(L) == 0: return 0 if len(K) == 0: return 0 elif len(L) & len(K) == 1: return L[x]*K[x] elif len(L) & len(K) == 2: return L[x] * K[x] + L[x-1] * K[x-1] elif len(L) & len(K) == 3: return L[x] * K[x] + L[x-1] * K[x-1] + L[x-2] * K[x-2] elif len(L) & len(K) == 4: return L[x] * K[x] + L[x-1] * K[x-1] + L[x-2] * K[x-2] + L[x-3] * K[x-3] #Tries (kind of, I deleted most of my code...) # elif len(L) == len(K): #Infinite Recursion Error # return L[x] * K[x] + (dot(L, K)-1) # elif len(L) == len(K): #Object of Type int has no len() Error # return L[x] * K[x] + dot(L[x-1], K[x-1])
错误原因分析
- 第一个递归尝试的问题:调用
dot(L, K)时传入的还是原列表,没有缩小问题规模,函数会无限调用自身,触发无限递归错误——调深度限制没用,因为根本没有能终止递归的条件。 - 第二个递归尝试的问题:
L[x-1]取的是列表中的单个数值(int/float),不是子列表,传给dot函数后,函数里执行len()就会抛出“int没有len()”的类型错误。
正确的递归实现
递归的核心是每次把问题拆分为「当前元素的乘积」加上「剩余子列表的点积」,同时设置明确的终止条件:
实现方式1(从后往前处理)
def dot_recursive(L, K): # 终止条件:长度不等或空列表返回0 if len(L) != len(K) or len(L) == 0 or len(K) == 0: return 0 # 只剩一个元素时直接返回乘积 if len(L) == 1: return L[0] * K[0] # 递归调用:最后一个元素的乘积 + 前面子列表的点积 return L[-1] * K[-1] + dot_recursive(L[:-1], K[:-1])
实现方式2(从前往后处理,更简洁)
def dot_recursive(L, K): if len(L) != len(K): return 0 if not L: # 空列表直接返回0 return 0 # 第一个元素的乘积 + 剩余子列表的点积 return L[0] * K[0] + dot_recursive(L[1:], K[1:])
测试验证
比如调用dot_recursive([1,2,3], [4,5,6]),计算过程是1*4 + 2*5 + 3*6 = 4+10+18=32,运行后会正确返回结果,不会出现递归错误。
内容的提问来源于stack exchange,提问作者MrPuffer
相关产品推荐
相关产品推荐

