tail-recursion相关内容

尾递归映射函数球拍

racket中的map函数接受一个函数和一个列表,并递归地将该函数应用于列表中的每个项目。我正在尝试将映射转换为尾递归函数,如何才能做到这一点? 推荐答案 您卡在哪里?您可以使用内部loop过程定义您自己的map过程。 (define (map f in) (define (loop out lst) (if #|exit condition here|# ..
发布时间:2022-03-27 16:11:40 其他开发

Python 是否优化尾递归?

我有以下代码失败并出现以下错误: RuntimeError: 超出最大递归深度 我试图重写它以允许尾递归优化 (TCO).我相信如果发生了 TCO,这段代码应该是成功的. def trisum(n, csum):如果 n == 0:返回 csum别的:返回 trisum(n - 1, csum + n)打印(三和(1000,0)) 我应该断定 Python 不会产生任何类型的 TC ..
发布时间:2022-01-22 12:00:36 Python

JVM 会阻止尾调用优化吗?

我在这个问题上看到了这句话:构建 Web 服务的好的函数式语言是什么? 特别是 Scala 不支持尾调用消除,除非在自递归函数中,这限制了您可以执行的组合类型(这是 JVM 的基本限制). 这是真的吗?如果是这样,那么造成这种基本限制的 JVM 是什么? 解决方案 这篇文章:递归还是迭代? 可能会有所帮助. 简而言之,由于安全模型和需要始终提供可用的堆栈跟踪,尾调用优化很 ..
发布时间:2022-01-16 11:43:02 Java开发

Prolog递归计算列表中的数字

我需要一个程序来计算列表中的所有数字,无论它们嵌套得多么深.我能够在数字不在另一个列表中的情况下计算数字,但是通过深度嵌套的元素递归是行不通的.到目前为止我有这个: count([],0).计数([H|尾巴],N):-计数(尾巴,N1),(数(H)->N 是 N1 + 1;is_list(H)->计数(H,N);N = N1). 所以,如果我要调用 count([a,1,[2,b],3],N) ..
发布时间:2022-01-12 10:50:49 其他开发

Prolog 性能和递归类型

我在几个程序中使用 permutation 并偶然发现了这个小实验: 排列方式一: 置换([], []).置换([X|Rest],L):-置换(休息,L1),选择(X,L,L1). 排列方法二: 置换([], []).置换(L,[P | P1]):-选择(P,L,L1),置换(L1,P1). 排列方式3(使用内置): permute(L, P) :- 置换(L, P). 我知道使 ..
发布时间:2022-01-12 10:26:11 其他开发

后缀表达式列表求值

我编写了一个程序来从表达式列表中递归地评估 prolog 中的后缀表达式.例如,给定以下列表: [+,1,2] 它应该返回 3.我构造谓词的方式是递归地调用自身,直到它到达列表的末尾,以便它向后读取值.(与从左到右阅读此列表相同:[2,1,+]). 我的问题是,当我尝试通过递归调用返回多个值时,所有值都会突然消失. 代码如下: eval_list([Head|Tail],_,Re ..
发布时间:2022-01-12 10:20:41 其他开发

Prolog从尾部找到列表中的最大整数

我需要从列表的头部或尾部找到列表中的最大整数.我已经编写了一个可以从头部找到最大的程序,现在我需要一些帮助才能从尾部开始. 这是我目前所拥有的: 最大([X],X).最大([X|Xs],X):- 最大(Xs,Y),X>=Y.最大([X|Xs],N):- 最大(Xs,N),N>X. 请记住,这会从头部找到最大的整数,我需要它从尾部开始工作.感谢您的帮助. 解决方案 等一下!在继续之 ..
发布时间:2022-01-12 10:07:55 其他开发

我应该避免在 Prolog 和一般情况下进行尾递归吗?

为了好玩,我正在阅读“Learn Prolog now"在线书籍. 我正在尝试编写一个谓词,该谓词使用累加器遍历列表的每个成员并向其添加一个.我已经很容易做到了,没有尾递归. addone([],[]).addone([X|Xs],[Y|Ys]) :- Y 是 X+1,addone(Xs,Ys). 但我已经读到,出于性能原因,最好避免这种类型的递归.这是真的?总是使用尾递归是否被认为是“ ..

将两个列表附加在一起的 Prolog 算法的说明

这是一种将两个列表附加在一起的算法: 域列表=整数*谓词非确定附加(列表,列表,列表)条款附加([],列表,列表):-!.附加([H|L1],List2,[H|L3]):-附加(L1,List2,L3).目标追加([9,2,3,4],[-10,-5,6,7,8],Ot). 结果是一个列表[9,2,3,4,-10,-5,6,7,8],保存在“Ot". 我的问题是,这是如何工作的? 我 ..

为什么这个 F# 序列函数不是尾递归的?

披露:这出现在 FsCheck 中,这是我维护的 F# 随机测试框架.我有一个解决方案,但我不喜欢它.而且,我不明白这个问题——它只是被规避了. (monadic,如果我们要使用大词)序列的一个相当标准的实现是: 让序列 l =让 k m m' = gen { 让!x = 米让!xs = m'返回 (x::xs) }List.foldBack k l (gen { return [] }) ..
发布时间:2022-01-05 09:54:23 其他开发

F# 尾递归函数示例

我是 F# 的新手,正在阅读有关尾递归函数的内容,希望有人能给我提供两种不同的函数 foo 实现——一种是尾递归,另一种不是尾递归,以便我更好地理解原理. 解决方案 从一个简单的任务开始,比如在列表中将项目从 'a 映射到 'b.我们想写一个有签名的函数 val 映射:('a -> 'b) ->'一个列表 ->'b 列表 哪里 map (fun x -> x * 2) [1;2;3; ..
发布时间:2022-01-05 09:31:38 其他开发

如果 Clojure 中唯一的非堆栈消耗循环结构是“recur",那么这个惰性序列是如何工作的?

lazy-seq 的 ClojureDocs 页面给出了一个例子 生成所有正数的惰性序列: (定义正数([] (正数 1))([n] (cons n (lazy-seq (positive-numbers (inc n)))))) 这个lazy-seq 可以针对相当大的索引进行评估,而不会抛出 StackOverflowError(与同一页面上的筛选示例不同): user=>(nth (正数 ..
发布时间:2022-01-02 22:41:15 其他开发

recur 的尾部位置到底是什么?

“尾部位置"的准确定义是什么?对于 Clojure 中的 recur?我认为这将是循环 S 表达式中的最后一项,但在下面的示例中,在我看来,以 (if ...) 开头的 S 表达式在尾部位置即(循环[绑定语句] [if 语句]). (= __(循环 [x 5结果 []](如果 (> x 0)(recur (dec x) (conj 结果 (+ 2 x)))结果))) (代码取自 http:// ..
发布时间:2022-01-02 22:38:31 其他开发

在 F#/OCaml 中实现类似快速排序的函数的尾递归版本

是否可以实现快速排序算法的尾递归版本(通过延续模式)?如果是,人们将如何实施它? 普通(未优化)版本: let rec quicksort list =匹配列表|[] ->[]|元素::[] ->[元素]|枢轴::休息->让``小于pivot的元素``,``大于或等于pivot的元素``=休息|>List.partition(fun element -> element 解决方案 直 ..
发布时间:2022-01-02 13:48:51 其他开发

如何为延续 monad 实现堆栈安全的 chainRec 运算符?

我目前正在试验延续 monad.Cont 实际上在 Javascript 中很有用,因为它从回调模式中抽象出来. 当我们处理一元递归时,总会有堆栈溢出的风险,因为递归调用不在尾部位置: const chain = g =>f=>k=>g(x => f(x) (k));= x => 的常量k=>k(x);const id = x =>X;const inc = x =>x + 1;con ..