List 使用递归检查列表中的每一对,如果它们的和为负数,则返回True,否则返回False
这就是我目前所拥有的List 使用递归检查列表中的每一对,如果它们的和为负数,则返回True,否则返回False,list,python-3.x,recursion,List,Python 3.x,Recursion,这就是我目前所拥有的 def negative_sum(L): if len(L) == 2: if L[0] + L[1] <0: return True else: return False else: return negative_sum(L[0] + negative_sum(L[1:])) def负和(L): 如果len(L)==2: 如果L[0]+L[1]
def negative_sum(L):
if len(L) == 2:
if L[0] + L[1] <0:
return True
else:
return False
else:
return negative_sum(L[0] + negative_sum(L[1:]))
def负和(L):
如果len(L)==2:
如果L[0]+L[1]Awhile
循环相当于使用单个执行帧的“尾部递归”。有些问题更容易用递归表示,有些问题则更容易用循环表示。使用嵌套的for
循环可以轻松生成对
def pairs1(seq``):
n = len(seq)
pairlist = []
for i in range(0, n-1):
for j in range(i+1, n):
pairlist.append((seq[i],seq[j]))
return pairlist
inp = (1, 2, 3)
out = [(1,2), (1,3), (2,3)]
assert pairs1(inp) == out
我通常使用yield
而不是pairlist.append
。注意代码中包含了一个测试。作为中间步骤,转换为单个while
循环
def pairs2(seq):
jmax = len(seq) - 1
pairlist = []
i = 0
j = i+1
while i < jmax:
pairlist.append((seq[i],seq[j]))
if j < jmax:
j += 1
else:
i += 1
j = i+1
return pairlist
assert pairs2(inp) == out
在Python中,所有添加项中的复制都将O(N)函数转换为O(N**2)函数,因此我不会这样做。看一看。
def pairs3(seq):
jmax = len(seq) - 1
pairlist = []
i = 0
j = i+1
def inner():
nonlocal i, j
if i < jmax:
pairlist.append((seq[i],seq[j]))
if j < jmax:
j += 1
else:
i += 1
j = i+1
inner()
inner()
return pairlist
assert pairs3(inp) == out
def pairs4(seq, i, j, pairlist):
jmax = len(seq) - 1
if i < jmax:
pairlist.append((seq[i],seq[j]))
if j < jmax:
return pairs4(seq, i, j+1, pairlist)
else:
return pairs4(seq, i+1, i+2, pairlist)
else:
return pairlist
assert pairs4(inp, 0, 1, []) == out
return pairs4(seq, i, j+1, pairtuple + ((seq[i],seq[j])))