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