【发布时间】:2021-06-22 04:15:21
【问题描述】:
我正在尝试在 prolog 中创建一个尾递归 drop/3。教给我们尾递归的方式(很差)甚至没有开始向我展示我需要如何解决这个问题。
据我所知,这是我唯一没有工作的东西,甚至不是尾递归的。我已经走到了尽头,所以任何帮助都将不胜感激。
drop(N, [], []).
drop(N, [A,As], Bs) :-
integer(N),
N > 0,
N1 is N - 1,
Bs is As,
drop(N1, As, Bs).
【问题讨论】:
-
这是完美的尾递归。在递归调用之后不需要计算 drop/3 中的任何内容。如果编译器足够精炼,它可以将其优化为一个常量堆栈空间循环,而不是每次调用时增加 1 个堆栈帧。
-
不确定这应该做什么。第一个参数有一个倒计时到 0(所以你最好为第一个子句写
drop(0, [], []).)。而且我确定在第二个子句头部的 arg 2 中错误地使用了逗号,而不是|。Bs is As肯定是错误的,尾递归调用本身也是错误的。
标签: recursion prolog tail-recursion