Python|函数递归-sin之舞

tech2022-08-29  93

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

欢迎加入团队圈子!与作者面对面!直接点击!

问题描述

最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。不妨设:An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)Sn=(...(A1+n)A2+n-1)A3+...+2)An+1FJ想让奶牛们计算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是一个字符串,那么问题也就变得简单了,只需要遍历这个字符串,如果出现正负号同时存在的情况,便将负号删除。

同时通过这个递归的简单应用,可以发现递归的一般思路步骤:首先分析问题,找到递归规律,然后找到递归出口,最后分析递归开始的条件和位置,完成递归。

END

实习编辑   |   王文星

责       编   |   黄章鱼

 where2go 团队


   

微信号:算法与编程之美          

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

最新回复(0)