问题描述
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设:
An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
解决方案
问题明显是两个部分,由An和Sn组成,而且Sn是由An和其他部分组成。
观察两个表达式,发现它们可以的组成含有一定的规律,开始考虑函数递归的思路,找到递归出口和递归规律。
先看Sn部分,将Sn的表达式进行翻转,然后将由+号连接的部分看作为一项,可以发现每一项都可以由一个通项公式——“Aj +(n + 1 - j)”表示,这个规律也就是递归的通项公式,而且递归出口也就是当j等于n时,也就是翻转后的Sn的第一项;
再看An部分,从后往前看,可以发现“I +(-1)i * sin()”构成了它前一项的sin内的值,且最后一项为sin(n),这样An的递归规律也就找到了,同时,递归出口也很容易发现:当i等于n的时候,也就是最后一项sin(n)。
python代码:
def An(i,n):#求An表达式的函数,if i==n:#递归出口,最后一项return 'sin'+'('+str(n)+')'else:return 'sin'+'('+str(i)+'+'+str((-1)**i)+str(An(i+1,n))+')'#连接通项公式,开始递归def Sn(n,j):#求Sn表达式的函数if j==n:#递归出口,翻转后Sn的第一项return str(n)+'+'+str(An(1,1))else:return str(j)+'+'+str(An(1,n+1-j))+'('+str(Sn(n,j+1))+')'#开始递归,需要将An()放入递归中 |
---|
结语
当完成上述函数递归后,假设需要求S3的表达式,会得到这样的结果:1+sin(1+-1sin(2+1sin(3)))(2+sin(1+-1sin(2))(3+sin(1))),这个结果虽然是正确的,但是出现一个问题,那就是负号出现时正号也会出现,也就还需要一些调整,注意得到的Sn是一个字符串,那么问题也就变得简单了,只需要遍历这个字符串,如果出现正负号同时存在的情况,便将负号删除。
同时通过这个递归的简单应用,可以发现递归的一般思路步骤:首先分析问题,找到递归规律,然后找到递归出口,最后分析递归开始的条件和位置,完成递归。