我有家庭作业,我必须使用递归来查找列表中的数字/字母/单词的所有出现并返回原始列表中的索引..我已搜索此网站以寻找之前已回答的问题,但我不能找到关于递归的任何答案,并选择继续检查列表,即使在第一次出现之后也是如此。
应该看起来很像:
>>> find_value( [4,7,5,3,2,5,3,7,8,6,5,6], 5)
[2,5,10]
到目前为止,我的代码是这样的:
def find_all(x,y):
if len(x) == 1 and x[0] == y:
return [i for i, y in enumerate(x)]
return find_all(x[1:],y)
虽然它只是最小化列表并给我与索引相同的[0] ..这是真的,对于分割列表..这样我永远不会得到原始索引.. 谢谢 - 如果这已经存在,我很抱歉我已经搜索过但找不到。
答案 0 :(得分:2)
这是一个简单的非递归解决方案:
def find_value(l, lookfor):
return [i for i, v in enumerate(l) if v == lookfor]
作为你的家庭作业的一条建议 - 只需将进度通过列表作为find_all
的可选第三个参数传递:
def find_value(list, lookfor, position=0)
...并在每次递归时添加一个position
。
答案 1 :(得分:1)
分配作业通常是为了让你可以探索问题并从中学习。在这种情况下,它是递归,通常对初学者来说很难。
递归的目的是从较小问题的解决方案中构建一个更大问题的答案。所以最好从最小的一个开始:
def find_all(haystack, needle):
if not haystack:
# no occurrences can happen
return []
如果列表不为空,我们可以检查第一个元素是否是我们要查找的内容:
if haystack[0] == needle:
occurrences = [0] # the index of the first element is always 0
else:
occurrences = []
我们还需要针对较小问题的解决方案:
recursive_occurences = find_all(haystack[1:], needle)
现在您注意到的问题是返回的索引始终为0.这是因为它们是较小列表中的索引。如果一个项目在较小的列表中有索引0
,则意味着它在最大列表中的索引实际上是1
(这是您的程序缺少的主要部分),因此:
for x in recursive_occurences:
occurrences.append(x+1)
并回答完整的答案:
return occurrences
我希望这会对你有所帮助,所以你可以自己做下一个功课。
答案 2 :(得分:0)
以下是几种解决方案:
一气呵成,丑陋,但工作:
def find_value(lst, elt):
return [x + 1
for x in ([] if not lst else
(([-1] if lst[0] == elt else []) +
find_value(lst[1:], elt)))]
更漂亮,但隐藏索引参数:
def find_value(lst, elt, idx=0):
return [] if not lst else \
(([idx] if lst[0] == elt else []) +
find_value(lst[1:], elt, idx + 1))
漂亮?,内部递归函数很长...更易于维护?
def find_value(lst, elt):
def _rec(lst, elt, idx):
if not lst:
return []
res = [idx] if lst[0] == elt else []
return res + _rec(lst[1:], elt, idx + 1)
return _rec(lst, elt, idx=0)
答案 3 :(得分:0)
这个问题有一个非常简单的解决方案,即使您使用递归来解决分配:
>>> def find_value(array, value):
*head, tail = array
array = find_value(head, value) if head else []
return array + [len(head)] if tail == value else array
>>> find_value([4, 7, 5, 3, 2, 5, 3, 7, 8, 6, 5, 6], 5)
[2, 5, 10]
>>>