Mathematica 中的替代递归函数定义语法



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

以下定义将起作用。

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

但是,这是行不通的。

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

我的问题是,是否有可能使类似于第二个定义的东西起作用,我可以根据i+1项而不是i项来定义函数?

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

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

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

总有"一种方法"。例如:

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

最新更新