假设我希望定义一个递归函数theta
,其功能应该在下面显而易见。
以下定义可行。
theta[0] = 0;
theta[i_ ] := theta[i-1] + 1
但是,这不起作用。
theta[0] = 0;
theta[i_ + 1] := theta[i] + 1
我的问题是,是否可以制作类似第二个定义的内容,我可以根据i+1
术语而不是i
术语来定义函数?
我知道它们在数学上是等价的,但我很好奇Mathematica是否会允许类似第二种语法的东西。
答案 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]