python递归列表问题

时间:2016-04-30 18:34:48

标签: python recursion

1.我遇到了这段代码:Python Recursion and list

 val lastRevs = distinctFileGidsRDD.
        mapPartitions{iter => 
          SetupJDBC(jdbcDriver, jdbcUrl, jdbcUser, jdbcPassword)
          iter.map{ element => 
            DB.readOnly { implicit session =>
              sql"SELECT jsonStr FROM lasttail WHERE fileGId = ${element(0)}::varchar"
              .map { resultSet => resultSet.string(1) }.single.apply()
            }
          }
        }

递归搜索可以从第一个元素开始def search(lst, key): if not lst: # base case: list is empty return False elif lst[0] == key: # base case: current element is searched element return True else: # recursive case: advance to next element in list return search(lst[1:], key) 吗?为什么第一个元素是单独处理的?

2.为什么这是递归?

search(lst[0:],key)

3 个答案:

答案 0 :(得分:5)

关于第一个问题:

如果以search(lst[0:], key)开始递归,那么您将进入无限递归。请注意,对于要停止的递归,您需要每次都使用比以前更小的列表,search(lst[1:], key)就是这种情况。

另外,关于为什么单独处理第一个元素,请注意您需要一次对key一个元素进行比较,并且该元素为lst[0]

因此在此递归中,您将问题分为两部分:(1)检查列表中的某个元素是否等于您的键(此元素始终是当前列表的第一个元素),以及(2)在列表的 rest 中的递归调用。

关于第二个问题:

这不是一个递归:

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

这些行的作用是创建一个列表,其中第4个元素是相同的列表:

>>> selfref_list == selfref_list[3] 
True

但这与函数中的递归无关。

答案 1 :(得分:1)

对于第一个问题,在第一行def search(lst, key)。也就是说,每次调用函数时,它都将使用与lst相同的整个lst[0:]。现在,你有

的原因
    else: # recursive case: advance to next element in list
        return search(lst[1:], key)

用于定义遍历当前第一个元素后发生的事情。基本上,它说,"在检查了第一个元素之后,继续检查从下一个元素开始的其余元素。"

答案 2 :(得分:1)

为什么第一个元素是单独处理的:  因为递归方法的每个实例都是您工作的一部分,所以该函数必须检查数组中的元素。第一个元素或lst[0]将是您为具有一个元素的列表调用函数时剩下的唯一元素,那么为什么不在每次列表都不为空时检查它?

为什么这是递归?

selfref_list = [1, 2, 3] selfref_list.append(selfref_list)

从字面意义上讲,它不是递归。相反,数据类型是递归的,这意味着对象可以将自身包含在相同对象类型的实例中。或者在更正式的数学术语中,允许语法树中的节点类型具有到相似类型的另一个节点的传出边缘...

recursive grammar

recursive data Type

Notice that the top list contains a similar list.