SWI-Prolog双阶乘实现:求((2n-1)!!)/(2n)!!的方法
实现SWI-Prolog双阶乘并计算目标比值
没问题!既然你已经掌握了普通阶乘的实现,那双阶乘的逻辑其实很好推导。先明确双阶乘的核心定义:
- 偶数的双阶乘:
(2n)!! = 2 × 4 × 6 × ... × 2n(从2开始连乘所有偶数,直到2n) - 奇数的双阶乘:
(2n-1)!! = 1 × 3 × 5 × ... × (2n-1)(从1开始连乘所有奇数,直到2n-1) - 基础规则:
0!! = 1,1!! = 1
第一步:实现通用双阶乘谓词
我们可以写一个能处理所有非负整数的双阶乘谓词,分情况处理偶数和奇数的递归逻辑:
% 基础情况:0和1的双阶乘都定义为1 double_factorial(0, 1). double_factorial(1, 1). % 处理大于1的偶数:N!! = N × (N-2)!! double_factorial(N, F) :- N > 1, 0 is N mod 2, N1 is N - 2, double_factorial(N1, F1), F is N * F1. % 处理大于1的奇数:N!! = N × (N-2)!! double_factorial(N, F) :- N > 1, 1 is N mod 2, N1 is N - 2, double_factorial(N1, F1), F is N * F1.
第二步:实现目标比值的计算
接下来封装一个专用谓词,直接计算你需要的((2n-1)!!)/(2n)!!。注意SWI-Prolog中/会返回浮点数或有理数(取决于数值),如果只需要整数除法可以用//,但这里显然我们需要的是精确的分数或浮点结果:
% 计算((2n-1)!!)/(2n)!!,Result返回最终计算值 double_factorial_ratio(N, Result) :- % 计算分子:(2n-1)的双阶乘 NumeratorTerm is 2*N - 1, double_factorial(NumeratorTerm, Numerator), % 计算分母:2n的双阶乘 DenominatorTerm is 2*N, double_factorial(DenominatorTerm, Denominator), % 计算比值(用/得到浮点/有理数,//是整数除法) Result is Numerator / Denominator.
测试示例
比如当n=2时,((3)!!)/(4)!! = (1×3)/(2×4) = 3/8 = 0.375,你可以在SWI-Prolog中直接测试:
?- double_factorial_ratio(2, R). R = 0.375.
如果需要保留有理数形式(而非浮点数),SWI-Prolog会自动处理,比如n=3时:
?- double_factorial_ratio(3, R). R = 5/16. % 等价于0.3125
内容的提问来源于stack exchange,提问作者Thegrep1
相关产品推荐
相关产品推荐

