【问题标题】:How can i get the indexes of all the occurrences of an element in a list through recursion?如何通过递归获取列表中所有出现的元素的索引?
【发布时间】:2020-08-31 09:03:29
【问题描述】:

我在学习递归时偶然发现了一个问题。如何通过递归获取列表中所有元素出现的索引?

我的理解:

  1. 当索引等于数组的长度时,它返回数组(或应该返回索引数组)

  2. 第一次调用增加 fsf(found_so_far) 的出现并增加索引(当 if 条件执行时)

  3. 第二次调用只增加索引 idx(条件的 else 部分)

缺陷:

  1. 每次调用函数时都会创建一个新的空列表(存储所有出现的键的结果)
  2. append 函数不会将匹配项追加到结果列表中
  3. 在所有调用之后,由条件的 else 部分调用的空列表返回一个空列表(调用后/回溯)

我的代码:

def allindex(arr, idx, fsf, key):  #arr=array, idx=index, fsf=found so far, key=key to be found
    list = []
    if idx == len(arr):
        return list
    if arr[idx] == key:
        allindex(arr, idx + 1, fsf + 1, 8)
        list.append(idx)
        return list
    else:
        allindex(arr, idx + 1, fsf, 8)
        return list


arr = [2, 4, 5, 8, 1, 8, 6, 8, 7, 9]
allindex(arr, 0, 0, 8) #passes an (array,starting_index,found_so_far,key)

预期输出:

[3,5,7]

得到了:

[]

【问题讨论】:

    标签: python arrays python-3.x list recursion


    【解决方案1】:

    已发布解决方案的一个基本缺陷是:

    list = []                
    

    发布的递归总是从一个新数组开始,这会阻止解决方案被累积。

    此外,不鼓励在 Python 中将 list 作为变量名,因为它与内置函数冲突。

    工作递归函数

    def allindex(arr, key, i = 0, indexes = None):  
        if indexes is None:
          indexes = []
    
        # Reached end of list (Base case)
        if i  == len(arr):
          return indexes            # no more recursion
    
        # Found item
        if arr[i] == key:  
          indexes.append(i)              
    
        # Recursive call to next index of array
        allindex(arr, key, i+1, indexes)
    
        return indexes
    
    arr = [2, 4, 5, 8, 1, 8, 6, 8, 7, 9]
    print(allindex(arr, 8))
    
    Output: [3, 5, 7]
    

    【讨论】:

      【解决方案2】:
      def f(arr, val):
          # solve the base case
          if len(arr) == 0:
              return []
      
          # get  solution for arr[1:]
          res = f(arr[1:], val)
      
          # add one to res for correct indexing
          res = [i + 1 for i in res]
      
          if arr[0] == val:
              return [0] + res 
          return res
      

      【讨论】:

      • 感谢您采用这种聪明的方法(我一定会学习这些技巧并在竞争性编码中使用它们),非常感谢
      【解决方案3】:

      您可以使用 enumerate 来选择特定元素的索引。

      arr = [2, 4, 5, 8, 1, 8, 6, 8, 7, 9]
      my_number = 8
      
      index_list =[idx for idx, el in enumerate(arr) if el == my_number]
      

      【讨论】:

      • 它是关于如何进行递归
      【解决方案4】:

      您的代码的问题在于,每次递归调用该函数时,您都在创建一个新的list 对象,因为您每次都在执行list = []。 (顺便说一句,不要命名变量list,它已经是Python中的保留关键字,表示list类型,这里可以使用indices_found为例)

      你想要做的实际上是将相同的列表传递给函数的每个调用:

      def allindex(
          arr, idx, fsf, key, found_indices
      ):  # arr=array, idx=index, fsf=found so far, key=key to be found
          if idx == len(arr):
              return found_indices
          if arr[idx] == key:
              found_indices.append(idx)
              allindex(arr, idx + 1, fsf + 1, 8, found_indices)
              return found_indices
          else:
              allindex(arr, idx + 1, fsf, 8, found_indices)
              return found_indices
      

      这会正确返回[3, 5, 7]

      【讨论】:

      • 我的一种试验方法是您遵循的这种方法,似乎解释器的配置存在一些问题(它不能正常工作)。非常感谢
      猜你喜欢
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多