x
我正在尝试找出如何遍历列表并寻找x
(在这种情况下为1),并从xlst
中删除[1,1,2,1,2]
的所有实例,其中这种情况是[2,2]
。它应该输出 $('div#test img').attr('id')
,但只给我一个空列表。在我试图弄清楚这一点时,必须以递归方式进行,以更好地理解递归。
答案 0 :(得分:2)
首先,您的递归是无止境的,永远不会结束。处理递归函数时请小心。
def remove_allr(x, xlst):
if xlst:
if xlst[0] == x:
return remove_allr(x, xlst[1:])
return [xlst[0]] + remove_allr(x, xlst[1:])
return []
input_list = [1, 1, 2, 1, 2]
print(remove_allr(1, input_list)) # [2, 2]
它给出了预期的输出。
答案 1 :(得分:1)
首先让我指出,如果您不了解可变参数的工作原理,那么使用可变的默认参数将很危险:
def remove_elem(xl, x, res=[]): # don't do this!
执行以下操作:
def remote_elem(x1, x, res=None):
if res is None:
res = []
附加可变的默认参数更改默认值。相反,如果默认值为None
,请使用None
,并创建初始可变对象。注意is
在这里是适当的,因为None
(以及True
和False
)是单例。
为使递归正常工作,递归需要一个终止条件和一个递归定义。在这种情况下是:
示例(请注意,不需要默认参数)
def remove_allr(x,xlst):
# termination condition
if not xlst:
return []
# recursion
if xlst[0] == x:
return remove_allr(x,xlst[1:])
else:
return xlst[:1] + remove_allr(x,xlst[1:])
print(remove_allr(2,[1,2,3,2,4]))
输出:
[1, 3, 4]
这是一个不太重复的紧凑版本:
def remove_allr(x,xlst):
if not xlst:
return []
return ([] if xlst[0] == x else xlst[:1]) + remove_allr(x,xlst[1:])
答案 2 :(得分:0)
这可能不是学习递归的更好的任务,但这是:
def remove_elem(xl, x, res=[]):
if xl[0] != x:
res.append(xl[0])
if len(xl) > 1:
return remove_elem(xl[1:], x, res)
else:
return res
example_list = [1, 1, 2, 1, 1, 2]
final_result = remove_elem(example_list, 1) # final_result is [2, 2]
我认为不是更好的示例,因为递归函数需要在递归过程中传递一个附加列表以存储最终结果。
每次递归时,如果满足条件,将评估列表的第一个元素并将其添加到结果列表中。然后,如果列表的长度大于1(即还有其他元素要被撤消),则该函数将递归调用列表的其余部分,直到对所有元素求值为止。
最后的else
是递归中断的地方,并返回最终结果。
答案 3 :(得分:-1)
也许是吗?
def remove_allr(x, oldlist):
newlist = []
for n in oldlist:
if n != 1: newlist.append(n)
return newlist
remove_allr(1, [1,1,2,1,2])
# [2, 2]
递归
def remove_allr_rec(x, oldlist, newlist):
if len(oldlist) == 0:
return newlist
last = oldlist.pop()
if last != x:
newlist.append(last)
return remove_allr_rec(x, oldlist, newlist)
remove_allr_rec(1, [1, 1, 2, 1, 2], [])
# [2, 2]