想象我在数学定义的递归阶乘,像这样:在Mathematica中,为什么递归函数中的替换不会终止?
Clear[fact]
fact[0] = 1
fact[n_] := n fact[n - 1]
评估事实[10]确认功能的工作原理和终止。
一个主要的例子,但它在这个问题上的目的。实际上,我的问题一般都是关于递归函数定义的。
我的预期评估以下替换终止,以及:
x fact[x-1] /. x -> 2
唉,在一个递归深度限制运行:
$RecursionLimit::reclim: Recursion depth of 256 exceeded.
我希望看到这样的:
2 fact[2-1]
或只是值
2
UPDATE:的其实另一种递归定义确实按预期方式工作:
Clear[fact]
fact[n_] := If[n < 1, 1, n fact[n - 1]]
但这一事实(双关语意;-)使得它更神秘的对我说:为什么它表现如此不同?
我的问题是双重的:
即使有内置的帮助和搜索网为线索,我无法解释为什么数学在坚持,很显然,保持象征性的结果,而不是评估'中间'结果并很好地结束。谁冒险一个可行的解释?
我该如何说服Mathematica根据我的期望执行(除了使用的替代方案,如果 [])?
我真的很困惑这个,我真的希望有人能帮助我。
/M炼
Aha,这很有道理:Mathematica首先评估/的LHS。然后_then_执行替换。通过Hold [],您可以推迟“渴望”的评估。感谢您的杰出答案:有效,相关,清晰和简洁!我的赞美 – nanitous
@nanitous干杯!如果三个答案中的一个能够回答您的问题,您可以将其标记为已接受的答案,以便它出现在顶部(并为答案者提供声望提升)。 – acl
谢谢指出! – nanitous