Python|函数递归-sin之舞
  TEZNKK3IfmPf 2023年11月15日 21 0

问题描述

最近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是一个字符串,那么问题也就变得简单了,只需要遍历这个字符串,如果出现正负号同时存在的情况,便将负号删除。

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
TEZNKK3IfmPf