Mathematica中的备用递归函数定义语法

时间:2013-10-26 23:18:10

标签: recursion wolfram-mathematica

假设我希望定义一个递归函数theta,其功能应该在下面显而易见。

以下定义可行。

theta[0] = 0;               
theta[i_ ] := theta[i-1] + 1

但是,这不起作用。

theta[0] = 0;               
theta[i_ + 1] := theta[i] + 1

我的问题是,是否可以制作类似第二个定义的内容,我可以根据i+1术语而不是i术语来定义函数?

我知道它们在数学上是等价的,但我很好奇Mathematica是否会允许类似第二种语法的东西。

2 个答案:

答案 0 :(得分:1)

如果您了解默认自动简化已经完成(通常在您获得控制权之前),并且然后使用与您的定义匹配的适当参数的定义,则完全可行第二个定义。

实施例

In[1]:= theta[i_ + 1] := Sin[i]+1;
theta[a + 1]

Out[2]= 1+Sin[a]

但是你可能希望将其用作

In[3]:= theta[8]

Out[3]= theta[8]

并且失败了,因为你定义了一个匹配某个东西和一个的总和的函数,但只给了它一个整数,你没有与之匹配的定义。即使这样也失败了

In[4]:= theta[7 + 1]

Out[4]= theta[8]

因为默认的自动规则将两个整数的总和转换为整数,然后又回到前一个案例。

有时候说Mathematica进行“结构”匹配,如果两个表达式的两个结构匹配,Mathematica接受这个匹配。这与具有一定数学成熟度的任何人都会使用的匹配类型非常不同。十年或更久以前有人在Mathematica期刊上写了一篇文章,表明可以在Mathematica中使用更多数学版本的匹配。我认为这完全被忽略了,没有做过更多的事了。如果具备所需技能的人能够将该代码提升到当前版本的Mathematica,那将是很好的,但我认为这可能是一个重大挑战。

答案 1 :(得分:0)

总有“一种方式”。例如:

ClearAll[a];
a[i_] = a[i] /.  First@RSolve[{a[i + 1] == a[i] + 1, a[0] == 0}, a[i], i]