前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python|函数递归-sin之舞

Python|函数递归-sin之舞

作者头像
算法与编程之美
发布2020-09-08 17:13:18
7590
发布2020-09-08 17:13:18
举报

问题描述

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

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

END

实习编辑 | 王文星

责 编 | 黄章鱼

where2go 团队


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档