Prolog 中的阶乘列表

标签 list prolog factorial

我在完成以下练习时遇到问题...

阶乘可以在 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/

相关文章:

java - 共享部分列表以避免复制

prolog - 求所有以数字为极限的立方根

c# - C# 的 SWI PROLOG 问题

prolog - 适用于大数的 positive_integer/1 谓词

python - 创建月份列表的函数,其中 januari 是日期,其他月份是字符串

Python 列表规范化

java - 以 2 个数字作为输入并查找这些数字以及中间每个数字的阶乘的程序?

c++ - 记忆化的递归阶乘函数?

java - 从列表中提取文件名

python - 在 Python 中除以长整型会返回错误的答案