You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:54:35