recursion - 在 prolog 中生成从 N 到 1 的数字列表

标签 recursion prolog

我正在尝试生成从 N 到 1 的数字列表,而不使用任何内置谓词(例如 findall 或 numlist)。我究竟做错了什么 ?

    pred(N,[H|T]):-  H is N, N1 is N-1, pred(N1,T).
    pred(1,[]).

我不断收到错误:超出全局堆栈

最佳答案

最完整的解决方案是:

pred(1, [1]).
pred(N, [N|T]) :-
    N > 1,
    N1 is N-1,
    pred(N1, T).

没有N > 1条件你仍然会得到堆栈溢出:

| ?- pred(3, L).

L = [3,2,1] ? ;

Fatal Error: global stack overflow (size: 32768 Kb, reached: 32765 Kb, environment variable used: GLOBALSZ)

但是有了 N > 1条件:

| ?- pred(3, L).

L = [3,2,1] ? ;

(1 ms) no
| ?-

此外,在正确的条件下,谓词的顺序不再重要。这是因为您的条款只能在其应有的条件下有效。没有它,您的pred(N, [N|T]) :- ...子句,仅在 N > 1 时运行还将尝试在 N =< 1 时运行。交换子句顺序只会隐藏这个问题,而且只是在一定程度上隐藏。然而,顺序对于效率来说很重要。

关于recursion - 在 prolog 中生成从 N 到 1 的数字列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44372486/

相关文章:

java - 我们如何创建一个算法来检查一个字符串是否是两个字符串合并的结果?

C rename() FileNotFound 尽管文件存在

prolog - 密码算术难题(Prolog)

recursion - Prolog递归程序不返回值

perl - 从散列键列表中反序列化嵌套散列

python - 为什么退出递归调用时保留一些变量或列表,而另一些则不保留?

java - Java中的评估顺序

prolog - 如何在 Prolog 中获取列表第一个元素的列表?

parameters - Prolog 将谓词统一为参数

prolog - Prolog 中的剪切和失败