我看了谈话“三个美丽的快速排序”,并开始忙于快速排序。我在python中的实现与c非常相似(选择数据透视图,围绕它的分区并在越来越大的分区上递归)。我以为不是
pythonic 。
所以这是在python中使用列表理解的实现。
def qsort(list):
if list == []:
return []
pivot = list[0]
l = qsort([x for x in list[1:] if x < pivot])
u = qsort([x for x in list[1:] if x >= pivot])
return l + [pivot] + u
让我们将递归称为qsortR。现在我注意到对于大型列表,qsortR的运行速度比qsort慢得多。实际上,对于递归方法,即使对于1000个元素,“最大递归深度都超过了cmp”。我在sys.setrecursionlimit中重置了它。
一些数字:
list-compr 1000 elems 0.491770029068
recursion 1000 elems 2.24620914459
list-compr 2000 elems 0.992327928543
recursion 2000 elems 7.72630095482
所有代码都在这里。
我有一些问题:
因为列表理解意味着C循环,它比使用Pythonfor
块的慢速通用方法要快得多。
万一您的内存不足。
Python的递归带来了这样的开销,因为每个函数调用都会在每个调用上分配大量的堆栈内存空间。
一般而言,迭代就是答案(在统计上99%的用例中,其性能都会更好)。
谈到内存结构,如果您有简单的数据结构,例如chars,integers,floats:请使用内置函数,array.array
它比a的内存效率高得多list
。
问题内容: 是否可以在Python中定义递归列表理解? 可能是一个简单的示例,但类似于: 这样有可能吗? 问题答案: 不,没有(记录,可靠,稳定,… ;-)引用“当前理解”的方法。您可以只使用一个循环: 当然,这是非常昂贵的(O(N平方)),因此您可以使用辅助工具对其进行优化(我假设将项目的顺序与中的项目顺序保持一致,否则可以做到;-)。 ..: 对于非常长的列表(O(N)而不是N平方),这要快得
本文向大家介绍Java中递归原理实例分析,包括了Java中递归原理实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了Java中递归原理。分享给大家供大家参考。具体分析如下: 解释:程序调用自身的编程技巧叫做递归。 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一
最初,我发布了一个问题“理解尾部递归向量- Q2)尾递归,这让我很难理解。我理解他们为什么需要尾递归,基本上他们用它来避免迭代,所以他们使用helper作为中间例程...所以他们可以避免将每次迭代放入堆栈...类似这样的东西。和letrec/lambda表达式,如下所示: 第Q2-2行:为什么这是“局部递归”“局部”对我来说是递归的中间例程。。。在这里中间意味着我的理解。。 [我的困惑]尾递归是不
我试图使用递归打印链表中每个节点中的数据,但是我得到了越界错误,所以我认为递归函数有问题。 这是头文件: 基本上,我从公共函数调用私有助手函数。下面是两个函数的代码: 我认为问题出在if块中,因为如果没有下一个节点,我需要停止,但在返回之前还需要打印当前节点中的数据,但因为我已经调用了
我对函数式编程很陌生,尤其是下面使用的Scheme。我正在尝试使以下函数是递归的,尾递归的。基本上,该函数的作用是对两个字符串的对齐方式进行评分。当给定两个字符串作为输入时,它会比较每个“列”字符,并根据在称为 scorer 的函数中实现的评分方案(由下面的代码中的函数调用)来累积该对齐的分数。 我有一个想法,用一个帮助函数来累积分数,但我不太确定如何去做,因此我该如何让下面的函数尾递归呢?
问题内容: 使用MySQL,我想从具有此类字段结构的表中返回父母列表。ID,PARENTID,NAME(标准的父子层次结构)。我想遍历树以返回所有“父母”的列表。 我意识到“嵌套集”可能是处理此问题的更好方法-但目前我无法更改数据的结构。我将来会希望这样做。当前-我的数据集实际上将包含一些深度级别- 没什么疯狂的……也许2-5,所以我的递归命中不应太“昂贵”。 我已经看过SQL Server获取父
我的数据结构如下所示: Foo的每个实例都可以包含任意数量的S,这当然反过来又可以包含更多的S等等。那么,我该如何让FreeMarker通过这样的列表呢?
我试图编写一个递归函数,它将包含整数列表的列表作为输入,并返回类型为([Int],Int]的元组。([Int],Int) 这是为“棋盘游戏”提供的,其中提供了一个棋盘: 这将是一个4行5列的电路板。列表中的数字是“硬币价值”。这个棋盘游戏的目标是从列表的顶部到底部收集硬币。你可以从最上面一排的任何位置开始,然后向下移动,你可以直接向下移动,也可以对角向左或向右移动。你需要的路径将为你提供最大的总硬