1

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

以下定义将起作用。

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

但是,这行不通。

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

我的问题是,是否有可能使第二个定义起作用,我可以根据i+1术语而不是术语来定义函数i

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

4

2 回答 2

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,那就太好了,但我认为这可能是一个巨大的挑战。

于 2013-10-27T00:25:24.950 回答
0

总会有办法的”。例如:

ClearAll[a];
a[i_] = a[i] /.  First@RSolve[{a[i + 1] == a[i] + 1, a[0] == 0}, a[i], i]
于 2013-10-28T14:16:21.513 回答