通过输入定义功能

时间:2018-01-14 21:45:34

标签: function recursion wolfram-mathematica

我似乎在Wolfram Mathematica中遇到了问题。我的目标是定义函数y [k],它可能包含递归,以及一些未定义函数u [k]的值。所以基本上这个函数应该是这样的: Y [k]的= A1 * Y [K-1] + A2Y [K-2] + ... + b1u [K] + .... 我对函数y的定义有一些问题:我想通过Input []来获得函数,所以我的程序将能够解决任何y函数。问题在于递归部分,请注意这确实可行:

y[k_] = Input[]

直到Input不包含任何递归表达式(例如,如果我输入u [k] + 8u [k-5],它可以完美地工作)。 但是,如果我输入任何包含递归的内容,例如:

1+y[k-1] (even if I define y[0]=0)

然后我得到一个递归深度超出错误。如果我声明几乎相同的功能硬编码到程序中这样:

y[k_]:=1+y[k-1] y[0]=0

该计划完美无瑕。有人可能会帮助我,所以我将能够输入包含递归的函数吗?谢谢!

另外:我甚至尝试过这样做,但无济于事:

c=Interpreter["MathExpression"][Input[]]
y[0]=0
y[k_]:=c

声明以下方式是不可取的,因为它在调用函数y的任何时候都要求输入:

y[k_]:=Input[]
y[0]=0

1 个答案:

答案 0 :(得分:1)

我总是惊讶于相对新手的Mathematica用户(当我错了时请原谅我)提出需要更深入理解表达式评估的方法以及为什么他们选择如此复杂的方法。< / p>

好的,这是发生的事情:当你写y[k_]=Input[]时,右边会立即被评估,你想要那样,因为你想输入你的定义。但是,当您在输入中按Enter键时,评估不会停止,因此Mathematica会立即尝试评估您放置的内容。如果您使用过y[k-1],那么Mathematica会尝试对此进行评估并最终进行无限递归。

如果你真的想做你想做的事情,那么你需要注入右侧表达式而不直接评估它。请注意,这是脆弱的,你正走在一条有许多漏洞的道路上。你可以做的是例如下面的

y[1] = 1;
(y[k_] := #) &[Input[]]

并在输入中插入1+y[k-1]之类的内容。我相信,对于你没有描述的潜在问题,有一种更好的方法。