[英]Python recursion depth exceeded limit exceeded, and don't know how to delete recursion
[英]How to limit the depth of recursion in python?
我有一个元素列表。 我想知道列表中是否有两对元素,其中一对元素具有相同的值。
我的想法是,我首先比较列表中的所有元素,如果找到一对,则从列表中删除该对,然后再次进行。 因此,我认为我可以使用递归来完成此任务,但是将深度限制为2即可解决问题。
这是我的第一次尝试:
recursion_depth=0
def is_twopair(card):
nonlocal recursion_depth
if recursion_depth==2: return True
for i in range(0, len(card)):
for k in range(i+1,len(card)):
if card[i].value==card[k].value:
del card[k], card[i]
recursion_depth+=1
is_twopair(card)
else: continue
else: continue
else: return False
我使用变量recursion_depth记录了递归的深度,但随后意识到return命令不会立即终止函数并返回true,而是返回其原始调用者is_twopair(card)。 所以我的问题是:
我知道也许有几种方法可以解决此问题。 但是我想忠实于自己的想法,并将其作为学习的机会。
我不相信您可以在没有一些严重的黑魔法的情况下“脱离”递归,也不相信您应该尝试这样做。 在返回链上级联返回值通常是一种很好的方法。
我个人将避免使用非局部变量,并在每个函数调用的范围内跟踪递归深度。
def remove_pairs(card, count=2, depth=0):
if depth == count:
return card
for i in range(0, len(card)):
for j in range(i+1, len(card)):
if card[i].value == card[j].value:
del card[j], card[i]
return remove_pairs(card, count, depth+1) # add return here
将深度跟踪移到函数本身中将允许从不同位置重复调用该函数而不会出现问题。
此外,可以使用itertools.combinations
清理一些代码。
from itertools import combinations
def remove_pairs(cards, count=2, depth=0):
if depth == count:
return cards
for card1, card2 in combinations(cards, 2):
if card1.value == card2.value:
cards.remove(card1)
cards.remove(card2)
return remove_pairs(cards, count, depth+1)
yourList = [1,1,2,2,3,4]
yourDict = {}
for i in yourList:
yourDict[i] = yourList.count(i)
此代码将返回列表中每个值的出现次数,因此您可以确定对数。
在这种情况下:
yourDict--> {1:2,2:2,3:3:1,4:1}
值1出现2次,值2出现2次,值3和4出现1次。
我认为您所缺少的是return
调用,以将递归调用的结果传递给前一个调用者:
if card[i].value==card[k].value:
del card[k], card[i]
recursion_depth+=1
return is_twopair(card) # add return here!
我真的不认为递归是解决此问题的自然方法,但是通过上述更改,它应该可以工作。 您可以通过将depth
作为可选参数传递来避免使用nonlocal
变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.