我正在尝试生成从 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/