小编mag*_*gma的帖子

记忆递归函数.如何让他们万无一失?

记忆功能是记住他们发现的值的功能.如有必要,请在文档中心查看Mathematica中的一些背景知识.

假设您有以下定义

f[0] = f[1] = 1
f[x_] := f[x] = f[x - 1] + f[x - 2]
Run Code Online (Sandbox Code Playgroud)

在你的一个包中.用户可以加载包并立即开始询问f [1000].这将触发$ RecursionLimit :: reclim错误消息并中止.即使用户然后尝试更小的东西,说F [20],现在f的定义是腐败的结果并不好anymore.Of课程包开发者可能会增加递归限制和警告用户,但我的问题是:

如何改进f定义,以便如果用户要求f [1000]他/她得到答案没有任何问题?我感兴趣的是捕获用户输入,分析它并采取评估f [1000]所需的任何步骤的方法.

我可以很容易想象,如果输入超过255(然后将其恢复到原始级别),可以更改递归限制,但我真正希望看到的是,如果有找到f的方法输出有多少值"知道"(fknownvalues)并接受任何输入<= fknownvalues + $ RecursionLimit没有问题,或者如果输入更高则增加$ RecursionLimit.

谢谢您的帮助

wolfram-mathematica

14
推荐指数
2
解决办法
982
查看次数

Mathematica中的任务中不需要的评估:为什么会发生这种情况以及如何在程序包加载期间调试它?

我正在开发一个(大)包,不再正常加载.这发生在我更改了一行代码之后.当我尝试加载包(使用Needs)时,包开始加载,然后其中一个setdelayed定义"活跃起来"(即以某种方式进行评估),被困在错误捕获例程之前加载几行和包加载中止.
带有中止的错误捕获例程正在执行其工作,除了在包加载阶段不应该首先调用它.错误消息显示错误的参数实际上是一个模式表达式,我在setdelayed定义的lhs上使用了几行.

像这样的东西:

……Some code lines

Changed line of code 

g[x_?NotGoodQ]:=(Message[g::nogood, x];Abort[])

……..some other code lines

g/: cccQ[g[x0_]]:=True
Run Code Online (Sandbox Code Playgroud)

当我尝试加载包时,我得到:

g::nogood: Argument x0_ is not good
Run Code Online (Sandbox Code Playgroud)

如您所见,传递的参数是一个模式,它只能来自上面的代码行.

我试图找到这种行为的原因,但到目前为止我还没有成功.所以我决定使用功能强大的Workbench调试工具.

我想逐步(或断点)看到加载包时会发生什么.我还不太熟悉WB,但似乎使用Debug as ...,首先加载包,然后最终使用断点调试,等等.我的问题是包装甚至没有完全加载!在加载包之前设置的任何断点似乎都没有效果.

所以... 2个问题:

  1. 任何人都可以解释为什么这些代码行在包加载期间"活跃起来"?(据我所知,包中没有明显的语法错误或代码片段)
  2. 任何人都可以解释如何(如果)在WB中加载时检查/调试包代码?

感谢您的任何帮助.

编辑

根据列昂尼德的回答并使用他的EvenQ例子:我们可以避免使用Holdpattern简单地通过定义up值来获得g之前的下行值

notGoodQ[x_] := EvenQ[x];
Clear[g];
g /: cccQ[g[x0_]] := True
g[x_?notGoodQ] := (Message[g::nogood, x]; Abort[])
Run Code Online (Sandbox Code Playgroud)

现在

?g

Global`g

cccQ[g[x0_]]^:=True



g[x_?notGoodQ]:=(Message[g::nogood,x];Abort[])



In[6]:= cccQ[g[1]]

Out[6]= True
Run Code Online (Sandbox Code Playgroud)

In[7]:= cccQ[g[2]]

During evaluation of In[7]:= g::nogood: -- Message text not found -- (2)

Out[7]= $Aborted
Run Code Online (Sandbox Code Playgroud)

所以...一般规则: …

wolfram-mathematica workbench

10
推荐指数
1
解决办法
979
查看次数

使用Mathematica Workbench 2.0在教程和符号页面中的干净会话中加载包

我正在使用Workbench开发包的文档.到目前为止我已经习惯了

Quit[]
Needs["mypackage`"]
Run Code Online (Sandbox Code Playgroud)

在每个教程的开头.这是因为我想要一个干净的全局环境和包装同时加载.

我运行了一些构建,一切都按预期工作,但我想知道:有没有更好的方法来获得一个干净的全局上下文,并且每次使用MMA启动我的软件包教程时"自动"加载包上下文?

换句话说:从一个教程到下一个教程,或从教程回到常规MMA笔记本,教程示例中定义的所有符号都可能被"遗忘"吗?在标准的MMA教程页面中,这似乎就是这样.

我想这可以通过本地/笔记本上下文完成.

但是这在实践中如何运作?

谢谢您的帮助

wolfram-mathematica workbench

5
推荐指数
1
解决办法
115
查看次数

标签 统计

wolfram-mathematica ×3

workbench ×2