2

我有作业,我必须使用递归来查找列表中所有出现的数字/字母/单词,并在原始列表中返回它们的索引。我已经在这个网站上搜索了以前回答的问题,但我找不到任何答案关于递归,即使在找到第一次出现后也可以继续检查列表。

应该看起来像这样:

>>> 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] .. 这是真的,对于划分的列表.. 这样我就永远不会得到原始索引.. 谢谢 - 如果这已经存在,我很抱歉因为我已经搜索过,但找不到。

4

4 回答 4

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每次递归时添加一个。

于 2012-11-17T14:31:26.913 回答
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

我希望这对你有一点帮助,这样你就可以自己做下一个作业了。

于 2012-11-17T15:31:28.833 回答
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)
于 2012-11-17T14:58:58.727 回答
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]
>>> 
于 2012-11-17T15:38:31.473 回答