关于Prolog递归阶乘实现的疑问:F1值的变化逻辑
拆解Prolog递归阶乘的运行逻辑
先明确核心误区:你把Prolog的变量当成了命令式语言里的可赋值变量,但Prolog是逻辑编程语言,变量的行为是绑定而非赋值——每个递归调用里的F1都是完全独立的变量,不是同一个值被修改。
先看给出的阶乘代码:
factorial(0,1). factorial(N,F) :- N>0, N1 is N-1, factorial(N1,F1), F is N * F1.
下面一步步拆解N=4时的完整运行流程,你就能明白F1的变化逻辑:
调用
factorial(4, F):- 满足
N>0,计算N1 = 4-1 = 3,接着触发子目标factorial(3, F1_1)(这里用F1_1标记这个调用里的F1,和其他调用的F1区分开)。
- 满足
进入
factorial(3, F1_1):- 满足
N>0,计算N1=3-1=2,触发子目标factorial(2, F1_2)。
- 满足
进入
factorial(2, F1_2):- 满足
N>0,计算N1=2-1=1,触发子目标factorial(1, F1_3)。
- 满足
进入
factorial(1, F1_3):- 满足
N>0,计算N1=1-1=0,触发子目标factorial(0, F1_4)。
- 满足
触发基例
factorial(0,1):- 这里直接把
F1_4绑定为1,到此递归的“拆解阶段”结束,开始回溯计算结果。
- 这里直接把
回溯到
factorial(1, F1_3):- 现在
F1_4=1,执行F is N * F1——这里的N是1,F1是刚绑定的1,所以F1_3 = 1*1 = 1(这个F1_3是当前子目标的结果,也就是1!)。
- 现在
回溯到
factorial(2, F1_2):- 现在
F1_3=1,N=2,所以F1_2 = 2*1 = 2(对应2!)。
- 现在
回溯到
factorial(3, F1_1):- 现在
F1_2=2,N=3,所以F1_1 = 3*2 = 6(对应3!)。
- 现在
回溯到最上层
factorial(4, F):- 现在
F1_1=6,N=4,所以F = 4*6 = 24(对应4!)。
- 现在
简单说,递归的过程是先把4!拆成4*3!,3!拆成3*2!,直到拆到0!=1的基例,然后从基例开始一步步往上计算,每个F1都是上一层递归的结果,它们是不同的变量,各自绑定了对应阶乘的值,不是同一个值被修改。
内容的提问来源于stack exchange,提问作者Sen ZmaKi
相关产品推荐
相关产品推荐

