tail-recursion相关内容
racket中的map函数接受一个函数和一个列表,并递归地将该函数应用于列表中的每个项目。我正在尝试将映射转换为尾递归函数,如何才能做到这一点? 推荐答案 您卡在哪里?您可以使用内部loop过程定义您自己的map过程。 (define (map f in) (define (loop out lst) (if #|exit condition here|#
..
我有以下代码失败并出现以下错误: RuntimeError: 超出最大递归深度 我试图重写它以允许尾递归优化 (TCO).我相信如果发生了 TCO,这段代码应该是成功的. def trisum(n, csum):如果 n == 0:返回 csum别的:返回 trisum(n - 1, csum + n)打印(三和(1000,0)) 我应该断定 Python 不会产生任何类型的 TC
..
我在这个问题上看到了这句话:构建 Web 服务的好的函数式语言是什么? 特别是 Scala 不支持尾调用消除,除非在自递归函数中,这限制了您可以执行的组合类型(这是 JVM 的基本限制). 这是真的吗?如果是这样,那么造成这种基本限制的 JVM 是什么? 解决方案 这篇文章:递归还是迭代? 可能会有所帮助. 简而言之,由于安全模型和需要始终提供可用的堆栈跟踪,尾调用优化很
..
我需要一个程序来计算列表中的所有数字,无论它们嵌套得多么深.我能够在数字不在另一个列表中的情况下计算数字,但是通过深度嵌套的元素递归是行不通的.到目前为止我有这个: count([],0).计数([H|尾巴],N):-计数(尾巴,N1),(数(H)->N 是 N1 + 1;is_list(H)->计数(H,N);N = N1). 所以,如果我要调用 count([a,1,[2,b],3],N)
..
我在几个程序中使用 permutation 并偶然发现了这个小实验: 排列方式一: 置换([], []).置换([X|Rest],L):-置换(休息,L1),选择(X,L,L1). 排列方法二: 置换([], []).置换(L,[P | P1]):-选择(P,L,L1),置换(L1,P1). 排列方式3(使用内置): permute(L, P) :- 置换(L, P). 我知道使
..
我编写了一个程序来从表达式列表中递归地评估 prolog 中的后缀表达式.例如,给定以下列表: [+,1,2] 它应该返回 3.我构造谓词的方式是递归地调用自身,直到它到达列表的末尾,以便它向后读取值.(与从左到右阅读此列表相同:[2,1,+]). 我的问题是,当我尝试通过递归调用返回多个值时,所有值都会突然消失. 代码如下: eval_list([Head|Tail],_,Re
..
我需要从列表的头部或尾部找到列表中的最大整数.我已经编写了一个可以从头部找到最大的程序,现在我需要一些帮助才能从尾部开始. 这是我目前所拥有的: 最大([X],X).最大([X|Xs],X):- 最大(Xs,Y),X>=Y.最大([X|Xs],N):- 最大(Xs,N),N>X. 请记住,这会从头部找到最大的整数,我需要它从尾部开始工作.感谢您的帮助. 解决方案 等一下!在继续之
..
为了好玩,我正在阅读“Learn Prolog now"在线书籍. 我正在尝试编写一个谓词,该谓词使用累加器遍历列表的每个成员并向其添加一个.我已经很容易做到了,没有尾递归. addone([],[]).addone([X|Xs],[Y|Ys]) :- Y 是 X+1,addone(Xs,Ys). 但我已经读到,出于性能原因,最好避免这种类型的递归.这是真的?总是使用尾递归是否被认为是“
..
这是一种将两个列表附加在一起的算法: 域列表=整数*谓词非确定附加(列表,列表,列表)条款附加([],列表,列表):-!.附加([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". 我的问题是,这是如何工作的? 我
..
我想定义一个适用于各种多路树的广义尾递归树遍历.这适用于前序和级序,但我无法实现后序遍历.这是我正在使用的多路树: 所需订单:EKFBCGHIJDA 只要不关心尾递归后序遍历就很简单: const postOrder = ([x, xs]) =>{xs.forEach(postOrder);console.log(`${x}`);};const 节点 = (x, ...xs) =
..
首先,我有两种不同的实现,我认为它们是正确的,并且对它们进行了分析并认为它们具有相同的性能: depth::Tree a ->整数深度 空 = 0深度(分支 b l r)= 1 + 最大(深度 l)(深度 r)depthTailRec::Tree a ->整数depthTailRec = depthTR 0 其中depthTR d 空 = ddepthTR d (Branch b l r) =
..
我刚刚开始使用 VS2010 学习 F#,下面是我第一次尝试生成斐波那契数列.我想要做的是建立一个所有小于 400 的数字的列表. 让 fabList =让 l = [1;2;]让可变 a = 1让可变 b = 2而 l.Tail
..
披露:这出现在 FsCheck 中,这是我维护的 F# 随机测试框架.我有一个解决方案,但我不喜欢它.而且,我不明白这个问题——它只是被规避了. (monadic,如果我们要使用大词)序列的一个相当标准的实现是: 让序列 l =让 k m m' = gen { 让!x = 米让!xs = m'返回 (x::xs) }List.foldBack k l (gen { return [] })
..
我有我为 f# 中的 morris seq 编写的“学习代码",它遭受堆栈溢出,我不知道如何避免.“morris"返回无限序列的“see and say"序列(即,{{1}, {1,1}, {2,1}, {1,2,1,1}, {1,1,1,2,2,1}, {3,1,2,2,1,1},...}). 让 printList l =Seq.iter (fun n -> printf "%i" n)
..
我是 F# 的新手,正在阅读有关尾递归函数的内容,希望有人能给我提供两种不同的函数 foo 实现——一种是尾递归,另一种不是尾递归,以便我更好地理解原理. 解决方案 从一个简单的任务开始,比如在列表中将项目从 'a 映射到 'b.我们想写一个有签名的函数 val 映射:('a -> 'b) ->'一个列表 ->'b 列表 哪里 map (fun x -> x * 2) [1;2;3;
..
lazy-seq 的 ClojureDocs 页面给出了一个例子 生成所有正数的惰性序列: (定义正数([] (正数 1))([n] (cons n (lazy-seq (positive-numbers (inc n)))))) 这个lazy-seq 可以针对相当大的索引进行评估,而不会抛出 StackOverflowError(与同一页面上的筛选示例不同): user=>(nth (正数
..
“尾部位置"的准确定义是什么?对于 Clojure 中的 recur?我认为这将是循环 S 表达式中的最后一项,但在下面的示例中,在我看来,以 (if ...) 开头的 S 表达式在尾部位置即(循环[绑定语句] [if 语句]). (= __(循环 [x 5结果 []](如果 (> x 0)(recur (dec x) (conj 结果 (+ 2 x)))结果))) (代码取自 http://
..
R 是否支持正确的尾递归?在哪里可以找到相关文档? 解决方案 很容易发现R不支持尾递归优化: f 如果尾调用被优化为跳转,那么这个函数就会毫无问题地终止.
..
是否可以实现快速排序算法的尾递归版本(通过延续模式)?如果是,人们将如何实施它? 普通(未优化)版本: let rec quicksort list =匹配列表|[] ->[]|元素::[] ->[元素]|枢轴::休息->让``小于pivot的元素``,``大于或等于pivot的元素``=休息|>List.partition(fun element -> element 解决方案 直
..
我目前正在试验延续 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
..