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

Recursion Mathematica中的交替递归函数定义语法,recursion,wolfram-mathematica,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是否会允许类似第二种语

假设我想定义一个递归函数
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的当前版本,那就太好了,但我认为这可能是一个巨大的挑战。

如果您了解默认的自动简化已经完成,并且通常在您能够控制之前,那么让您的第二个定义生效是完全可行的,然后,如果使用与定义匹配的适当参数来定义

范例

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]
总有“办法”。例如:

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