递归与循环的效率问题
来源:互联网 发布:仿糗事百科源码 编辑:程序博客网 时间:2024/06/05 19:43
递归与循环的效率问题
一摆案例:
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。(0<n<10000)
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
要求:1s内,256M内
考点:1简单循环的效率比递归高;2.利用10007的余数巧妙避开了大数BigInter操的作(这个类的操作效率很慢)。
那么这个时候平时算法学得好的童鞋都会立马写个递归函数,杠杠地,一个递归函数就搞定,多厉害。
publicstatic long fib(int n){
if(n==1 ||n==2)
return 1;
else{
return (fib(n-2)+fib(n-1))%10007;
}
}
然而,你在运行得时候却超过了1s,当n=45的时候,你运行得时间已经超过10s了,更别说n=10000。
那么这个时间就需要用简单循环来解决这个时间问题了:
for(inti=1;i<=n;i++){
if(i ==1 ||i==2) f[i] =1;
else f[i] =(f[i-2]+f[i-1])%10007;
}
这个时候1s内搞定,轻轻松松!!
二.原因分析:
大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N*局部变量、N*形参、N*调用函数地址、N*返回值。这势必是影响效率的。
所以,对于简单的问题,能用循环就别用递归。
- 递归与循环的效率问题
- 递归的效率问题及递归与循环比较
- 递归的效率问题及递归与循环比较
- 递归和循环的效率问题
- 递归调用效率问题,递归与循环比较
- 递归求和(Recursive)与for循环求和效率问题的简单比较
- Javascript递归与各种循环执行效率的比较
- 循环的效率问题
- python2 递归与迭代的效率问题
- 漫谈递归:递归的效率问题
- 递归及递归的效率问题
- 漫谈递归:递归的效率问题
- 漫谈递归:递归的效率问题
- 漫谈递归:递归的效率问题
- for循环的效率问题
- 关于 循环 效率的问题
- 递归与非递归的算法效率
- ++循环与i--循环的执行效率
- iOS 运行发现,view随着屏幕的变大整体放大的问题
- ClassNotFound/load XXXX error 的疑问杂症
- android中的动画
- leetcode:Convert Sorted Array to Binary Search Tree
- jQuery自学教程(三)——DOM操作
- 递归与循环的效率问题
- leetcode--Plus One
- javascript--argument&this
- BZOJ_P2324 [ZJOI2011]营救皮卡丘(网络流+最小费用最大流+Floyd)
- Redhat 7.0使用CentOS 7 的Yum 网络源
- Android Wear 8 Using Speakers on Wearables 在手表上面使用扬声器
- Android Shape属性介绍[图文]
- Mongodb 稀疏索引 sparse
- 外包模式