据我所知,递归在OOP和过程化编程中非常优雅,但效率低下(参见精彩的"High Order perl",Mark Jason Dominus)。我有一些信息,在函数式编程中,递归保持了它的优雅和简单性。有人能证实并可能放大这一点吗?我正在考虑XSLT和Haskell (在我的下一种学习语言列表中名列前茅)
谢谢
丹尼尔
我比较了循环和递归的运行时,发现循环要快得多,同时不会遇到运行RecursionError的问题。为什么循环要快得多?
def factorial(n):
if n == 0:
return n
else:
return n + factorial(n-1)
%%timeit -n1000 -r10000
factorial(1000)
163µs±13.2µs /环路(平均值±标准dev.共运行10000次,每个循环1000次)
def factorial2(n):
r = 0
for i in range(n+1):
r +=
我在学习递归的时候遇到了这个问题:
FORTRAN implementations do not permit recursion because
a. they use static allocation for variables
b. they use dynamic allocation for variables
c. stacks are not available on all machines
d. it is not possible to implement recursion on all machines.
我发现答案是(a)
但我想知道一种编程语言支持递归应该
我正在尝试用scala构建一个解析器,它可以解析简单的类似SQL的字符串。我已经掌握了一些基础知识,可以解析如下内容:
select id from users where name = "peter" and age = 30 order by lastname
但是现在我想知道如何解析嵌套的和类。
select name from users where name = "peter" and (age = 29 or age = 30)
我的'combinedPredicate‘的当前结果如下所示:
def combinedPredicate = p
如果我的函数满足了下面列出的两个要求,我相信函数Sum返回列表中项的求和,其中item对于给定的条件计算为true。这不意味着这个函数可以归为纯函数吗?
需求
对于给定的i/p集,无论何时调用函数,都会返回相同的o/p。
它没有任何副作用
public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){
int result = 0;
foreach(var item in numbers)
if(predicate(item)) res
在使用Java的动态编程中,我经常希望在递归步骤中将数组或对象作为参数传递。但是,为了使原始值不被修改,我必须在将对象作为参数传递之前克隆它;这样做将具有非常不利的时间和空间复杂性,因为该方法可能有数千个堆栈。我从上了解到,解决此问题的一种可能方法是在完成计算后撤消该过程。但是,有时这是不可能撤消的(例如,当递归方法从数组中删除元素时)。有谁有解决这个问题的办法吗?我在竞争性编程的背景下使用这一点,有时自下而上的解决方案过于复杂和不切实际。
举个例子:
public static int method(ArrayList<Integer> list) {
if(list.s
我是在研究函数式反应性编程时发现这一说法的,作者是海刘( Hai )和保罗·哈达克( Paul )的 (第5页):
假设我们希望define一个函数重复它的参数indefi,n: repeat =x: repeat,或者,在lambdas:λ=λx→x: repeats x,这需要O(n)空间。但是我们可以通过在xs中写入:λ=x→let xs =x: xs来实现O(1)空间。
这里的差别似乎很小,但它极大地促进了空间效率。为什么和如何发生?我所做的最好的猜测就是用手来评估它们:
r = \x -> x: r x
r 3
-> 3: r 3