问题是编写一个递归函数,从列表中删除重复项。
提示:它可以用两个辅助功能实现。
该列表包含以前存在的每个值中的一个且仅一个 在列表中。保留每个值的第一次出现。
实现并测试此方法的递归版本
def clean(self):
key_node = self._front
while key_node is not None:
# Loop through every node - compare each node with the rest
previous = key_node
current = key_node._next
while current is not None:
# Always search to the end of the list (may have > 1 duplicate)
if current._value == key_node._value:
# Remove the current node by connecting the node before it
# to the node after it.
previous._next = current._next
self._count -= 1
else:
previous = current
# Move to the _next node.
current = current._next
# Check for duplicates of the _next remaining node in the list
key_node = key_node._next
return
这就是我到目前为止,我不明白什么是辅助功能:
def clean(list):
i = 1
if len(list) == 0:
return []
elif len(list) == 1:
return list
elif list[i] == list[i-1]:
del list[i]
return clean(list[i:])
示例:对于list = [1,2,2,3,3,3,4,5,1,1,1]
,答案为[1,2,3,4,5,1]
答案 0 :(得分:0)
这是一个调用另一个递归函数并生成所需结果的函数。我想你可以称clean2
为辅助功能,但是,和你一样,我并不确切地知道它应该是什么意思。它是一个相当荒谬的代码片段,但它没有使用任何标准库函数,它修改了x。我希望它非常低效。如果我为日常工作写这篇文章,我可能会辞职。
def clean(x):
clean2(x, 1)
def clean2(x, i):
if i >= len(x):
return
if x[i] == x[i - 1]:
del x[i]
clean2(x, i)
else:
clean2(x,i+1)
the_list = [1,2,2,3,3,3,4,5,1,1,1]
clean(the_list)
print(the_list)
>>> [1,2,3,4,5,1]
答案 1 :(得分:0)
这是一个使用辅助函数go
来实际实现递归的递归定义。我们的想法是外部clean
函数可以接受任何可迭代对象(例如列表),并且它总是生成一个值列表:
def clean(iterable):
def go(iterator, result):
try:
x = next(iterator)
if result == [] or result[-1] != x:
result.append(x)
return go(iterator, result)
except StopIteration:
return result
return go(iter(iterable), [])
clean
只调用本地定义的go
函数,传递迭代器和最终结果值(最初为空列表)。 go
然后尝试推进迭代器并将引用的值与result
的结尾进行比较:如果它不同(或者结果为空),则附加值。 go
然后递归。