gpt4 book ai didi

recursion - 在 Mathematica 中,为什么递归函数中的替换不会终止?

转载 作者:行者123 更新时间:2023-12-03 22:27:36 26 4
gpt4 key购买 nike

想象一下,我在 Mathematica 中定义了一个递归阶乘,如下所示:

Clear[fact]
fact[0] = 1
fact[n_] := n fact[n - 1]

评估 fact[10] 确认函数工作并终止。

一个主要的例子,但它在这个问题中起到了它的作用。实际上,无论如何,我的问题都与递归函数定义有关。

我希望评估以下替代品也会终止:
x fact[x-1] /. x -> 2

唉,它遇到了递归深度限制:
$RecursionLimit::reclim: Recursion depth of 256 exceeded.

我希望看到类似的东西:
2 fact[2-1]

或者只是值(value)
2

更新: 的另一种递归定义事实确实按预期工作:
Clear[fact]
fact[n_] := If[n < 1, 1, n fact[n - 1]]

但这个事实(双关语;-)让我觉得更加神秘:为什么它的行为如此不同?

我的问题是双重的:
  • 即使有内置帮助并在网上搜索线索,我也无法解释为什么 Mathematica 显然坚持保留符号结果,而不是评估“中间”结果并很好地终止。谁敢提出可行的解释?
  • 我如何说服 Mathematica 按照我的期望执行(除了使用 If [] 使用替代方案)?

  • 我真的对这个感到困惑,我真的希望那里有人可以帮助我。

    /吐温

    最佳答案

    正在尝试 u[x_] := x; Trace[x*u[x] /. x -> 2] ,它首先计算 xu[x] .在您的情况下,它首先尝试评估 fact[x-1]更换前 x 2,并达到递归限制。
    Attributes[ReplaceAll]显示它没有属性 HoldFirst ,所以它从评估它的第一个参数开始。例如,

    ReleaseHold@ReplaceAll[Hold[x*fact[x - 1]], x -> 2]

    给出预期 2 ,因为它持有第一个参数,替换,然后释放持有,如你所愿。

    另一种方法是
    Unprotect[ReplaceAll]
    SetAttributes[ReplaceAll, HoldFirst]
    ReplaceAll[x*fact[x - 1], x -> 2]

    但不要这样做。

    不过,肯定有人很快会给出更好的解释。

    编辑:为了回答关于为什么的附加问题
    Clear[factif]
    factif[n_] := If[n < 1, 1, n factif[n - 1]]

    不会导致无限递归:以这种方式定义, factif[x]计算结果为 If[x < 1, 1, x factif[x - 1]] , 自 x<1无法评价。因此,在尝试评估 ReplaceAll 的第一个参数后,它仍然保持这种形式。 ,然后发生替换等。

    关于recursion - 在 Mathematica 中,为什么递归函数中的替换不会终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8191359/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com