go语言使用递归与循环两种方式计算斐波那契数列
题目
给定一个正整数n计算出对应斐波那契数列对应的值使用递归方式借助切片用循环方式
说明:递归函数的时间复杂度是Tn=O(f(n)),它表示随问题规模n的增大,算法的执行时间增长率和f (n)增长率成正比,这称作算法的渐进时间复杂度。 为了解决效率问题,可以将递归方式转换为循环方式,达到以空间换时间的效果。循环方式计算斐波拉契数列对应值时间复杂度仅O(n)。
代码实现
递归方式计算package main import ( "fmt" "time" ) /* 用递归方式计算斐波拉契数列 */ func fibonacci(n int) (res int) { if n<=1 { // n==0或n==1时,返回值为1 return 1 } else { // n>=2时,结果需要递归计算前2位的值 return fibonacci(n-1) + fibonacci(n-2) } } func main() { // 记录开始时间 start := time.Now().Unix() num := 52 // 给定一个值,计算结果 fmt.Println(fibonacci(num)) // 打印总耗时 fmt.Println("total(s):",time.Now().Unix() - start) }
循环方式计算package main import ( "fmt" "time" ) /* 以切片作为存储,用循环方式计算斐波拉契数列 相比递归方式,以空间换时间 */ func fibonacci(n int) []int { // 定义切片,用于保存结果 var numList []int res := 0 for i:=0;i<=n;i++ { if i==0 { numList = append(numList,1) } else if i==1 { numList = append(numList,1) } else { // 如果是n>=2,每个当前的值,等于切片的前2位之和 res = numList[i-1] + numList[i-2] numList = append(numList,res) } } return numList } func main() { // 定义切片,用于保存结果 var numList []int // 记录开始时间 start := time.Now().Unix() num := 52 // 给定一个值,计算结果 numList = fibonacci(num) fmt.Println(numList[num]) // 打印总耗时 fmt.Println("total(s):",time.Now().Unix() - start) }
结果比较
用mackbookpro i7 2.7GHZ笔记本进行测试,结果如下:
n
n=40
n=45
n=50
n=52
n=80
递归(秒)
0
5
59
163
>600
循环(秒)
0
0
0
0
0
备注: 当n=80时,由于测试等待时间过长,强制中断了执行。
从测试结果看出,当n逐渐增大,递归方式计算斐波拉契数列的时间复杂性急剧增加。当n值较大时可以考虑用循环方式代替。
类似的方式也可以用于,求阶乘、遍历目录、汉诺塔等问题的解决。在后期的文章中,我将这些内容进行补充,敬请期待,谢谢。
未来的电商,社交新零售!很长时间以来,微商行业的伙伴们会觉得我很轴,轴的可能有些固执,事实上也是这样的,我对一些观点理念方法论的的相信是非常坚定的,因为我认为,如果做的是没有方法论,或者方法论不够成熟的事
烂片之王古天乐终于拿影帝,你被他骗了多少年昨晚,47岁的古天乐凭借杀破狼贪狼拿下第37届香港电影金像奖影帝。其实出道25年,古天乐曾凭借门徒一个好爸爸扫毒三次被金像奖提名,可惜最终全都失之交臂。从第27届金像奖第一次入围到
奇正藏药冯柳入驻藏药龙头一年,戴维斯双击可期选股理由冯柳入驻奇正藏药近一年,公司股价整体处于震荡态势,近期成交量明显放大,资金关注度提升。证券简称奇正藏药评级A数据截止日期2019年9月30日单位亿元证券代码002287成立
智动力业绩增长的光鲜背后,是对股东权益的漠视选股理由业绩大幅增长证券简称智动力评级C数据截止日期2019年9月30日单位亿元证券代码300686成立日期2004年所在地深圳一主营业务主营业务手机等消费电子功能性器件的研发生产
安洁科技买买买之后即将商誉减减减,逆境能否反转?关注理由成交量上涨股价长期盘整年底商誉减值可能性较大证券简称安洁科技评级BBB数据截止日期2019年9月30日单位亿元证券代码002635成立日期1999年所在地苏州吴中一主营业务
三棵树行业集中度提升,建筑涂料龙头加杠杆顺势而上选股理由净利润翻倍增长2019年涨幅近三倍成交量持续高位机构扎堆证券简称三棵树评级A数据截止日期2019年9月30日单位亿元证券代码603737成立日期2003年所在地福建莆田一主
锐科激光国内激光器龙头,剑指历史新高选股理由新股上市一年有余,股价长期处于区间震荡态势,三季度营收大幅增长30,近期成交量缓步提升,短期有望实现箱体突破!证券简称锐科激光评级AAA数据截止日期2019年9月30日单位
爱朋医疗疼痛管理龙头,巨幅震荡后何去何从选股理由次新股业绩稳定增长股价宽幅波动证券简称爱朋医疗评级A数据截止日期2019年9月30日单位亿元证券代码300753成立日期2001年所在地江苏南通一主营业务主营业务疼痛管理及
坚朗五金基本面与股价双反转,戴维斯双击实锤了?选股理由业绩大幅增长股价底部反转成交量持续放大证券简称坚朗五金评级AA数据截止日期2019年9月30日单位亿元证券代码002791成立日期2003年所在地广东东莞一主营业务主营业务
捷捷微电IGBT不是概念,国产化大趋势增长可期选股理由华为进军IGBT功率半导体分立器龙头营收稳定增长证券简称捷捷微电评级A数据截止日期2019年9月30日单位亿元证券代码300623成立日期1995年所在地江苏启东一主营业务
飞荣达屏蔽导热材料龙头,积淀26年能否一飞冲天?行业逻辑15G领域行业增长2电子屏蔽导热材料市场集中度的提升3器件国产化趋势公司逻辑核心竞争力1研发与创新优势公司自设立以来26年,注重研发与创新,经多年研发生产积累,公司掌握了丰