想象一下,我在Mathematica中定义了一个递归因子,如下所示:
Clear[fact]
fact[0] = 1
fact[n_] := n fact[n - 1]
Run Code Online (Sandbox Code Playgroud)
评估事实[10]证实该功能有效并终止.
这是一个主要的例子,但它在这个问题中起到了作用.实际上,无论如何,我的问题一般都与递归函数定义有关.
我期望评估以下替换以终止:
x fact[x-1] /. x -> 2
Run Code Online (Sandbox Code Playgroud)
唉,它运行到递归深度限制:
$RecursionLimit::reclim: Recursion depth of 256 exceeded.
Run Code Online (Sandbox Code Playgroud)
我希望看到类似的东西:
2 fact[2-1]
Run Code Online (Sandbox Code Playgroud)
或只是价值
2
Run Code Online (Sandbox Code Playgroud)
更新:事实 的另一种递归定义确实按预期工作:
Clear[fact]
fact[n_] := If[n < 1, 1, n fact[n - 1]]
Run Code Online (Sandbox Code Playgroud)
但是这个事实(双关语意图;-)让我更加神秘:它为什么表现得如此不同?
我的问题是双重的:
即使有内置的帮助和搜索网络的线索,我也无法解释为什么Mathematica坚持,显然,保持符号结果,而不是评估"中间"结果并很好地终止.谁冒险进行了可行的解释?
我如何说服Mathematica根据我的预期执行(除了使用If [] 之外的替代方案)?
我真的对这个感到困惑,我真的希望有人可以帮助我.
/ M炼
LS
我只是在Odersky等人的"Scala编程"中学习Scala.
在关于演员的章节中,我遇到了无法解释的行为.更具体地说,当尝试向'self'发送消息时(另请参见示例)
进入Scala shell:
scala> import scala.actors.Actor._
import scala.actors.Actor._
scala > self ! "Hello"
scala > self.receive { case x => x }
Run Code Online (Sandbox Code Playgroud)
但最后一行没有"回归"预期答案:
resX:Any = hello
Run Code Online (Sandbox Code Playgroud)
需要执行Ctrl-C以使shell返回接受我的输入并返回以下消息:
Execution interrupted by signal.
scala> self.receive {case x => x}
// She's gone rogue, captain! Have to take her out!
// Calling Thread.stop on runaway Thread[Thread-54,5,main] with offending code:
// scala> self.receive {case x => x}
Run Code Online (Sandbox Code Playgroud)
但以下实际上有效:
self ! "Hello" ; self.receive { case x => x }
Run Code Online (Sandbox Code Playgroud)
我的问题是: …
我想要其中之一:
使用类似这样的脚本启动 python python my_routines.py,让 python 在代码my_routines.py已加载/运行时进入交互状态。
以交互模式启动 python 并以某种方便(简短易记)的方式加载my_routines.py
当然,我的想法是我想预加载一些东西,然后在交互模式下使用它。
涉及加载模块 ( python -m ....) 的建议不必适用;-)
期待您的想法!
吐万