我在完成以下练习时遇到问题...
阶乘可以在 Prolog 中描述为:
factorial(0, 1).
factorial(N, F) :-
N1 is N - 1,
factorial(N1, F1),
F is N * F1.
我需要扩展此代码,以便返回 N
之前所有先前阶乘的列表。但它仅返回第一个阶乘 (1),然后返回错误:ERROR: Out of local stack
。这是我的代码:
insertList(H, L, [H|L]) :-
!.
factorial(0, 1, [1]).
factorial(N, F, L) :-
N1 is N - 1,
factorial(N1, F1, L),
F is N * F1,
insertList(F, L, [F|L]).
list_factorial(X, L) :-
factorial(X, F, L).
我做错了什么?
最佳答案
:- use_module(library(clpfd)). list_factorial([1], 0). list_factorial(Zs0, N) :- length(Zs0, N), N #> 0, list_n_fac(Zs0, 1, 1). list_n_fac([], _, _). list_n_fac([Z1|Zs], N0, Z0) :- Z1 #= Z0 * N0, N1 #= N0 + 1, list_n_fac(Zs, N1, Z1).
示例查询:
?- list_factorial(Zs, 8). Zs = [1,2,6,24,120,720,5040,40320].
这是最常见的查询:
?- list_factorial(Zs, N). ( N = 0, Zs = [1] ; N = 1, Zs = [1] ; N = 2, Zs = [1,2] ; N = 3, Zs = [1,2,6] ; N = 4, Zs = [1,2,6,24] ; N = 5, Zs = [1,2,6,24,120] ...
关于Prolog 中的阶乘列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614473/