python中的迭代与递归
碰着一个环境,需要举办递归操纵,可是呢递归次数很是大,有一万多次。先不说一万多次递归,本来的测试代码是java的,没装jdk和编译情况,照旧用python吧
先看下原本的java代码:
public class UpCount { private long calc(int depth) { if (depth == 0) return 1; long cc = calc(depth - 1); return cc + (depth % 7) + ((((cc ^ depth) % 4) == 0) ? 1 : 0); } public static void main(String[] args) { UpCount uc = new UpCount(); System.out.println(uc.calc(11589)); } }
java没怎么玩过,可是这几行代码看过来照旧没压力的,快刀斩乱麻改为对付python代码
def calc(depth): if depth == 0: return 1 cc = long(calc(depth-1)) xor_mod = (cc ^ depth)%4 if xor_mod == 0: return cc+(depth%7)+1 else: return cc+(depth%7) number = long(calc(11589)) print number
代码粘上去,F5,堕落了
这个版本的代码原来是没有加long的,因为之前一串十几位的整数直接拿来就可以用,所以猜疑跟long是不是有干系
虽然啦,事实上这里跟long完全不要紧,python支持的整数长度可长短常长的,参考之前写的代码如下:
cimal = 7 original = 28679718602997181072337614380936720482949 array = "" result= "" while original !=0: remainder = original % cimal array += str(remainder) original /= cimal length = len(array) for i in xrange(0,length): result += array[length-1-i] print result
上面这段代码将一串很长的十进制数字转为7进制暗示,也可以转为任意进制,换做是8进制和16进制,一个oct(),hex()就搞定了,用辗转相除法来办理吧
因此,可以看出来,堕落不在于数的巨细,究竟11589对此刻的计较机来说只是小菜,2^16尚有65536呢
其实到这里才发明,没有说前面递归报错的真正原因,憔悴了
递归堕落的原因是因为python默认的递归限制只有1000次阁下,可是这里却要运行10000+,刷了半天:RuntimeError: maximum recursion depth exceeded
于是赶忙查了下,发明可以本身配置递归的限制,见python中递归的最大次数,作为延伸也可以查察官网文档
总的说来就是,为了防备益处和瓦解,python语言默认对次数加了限制,那么我改了这个限制是不是就ok了呢
import sys
# set the maximun depth as 20000
sys.setrecursionlimit(20000)
插入上面代码,坚决改20000,这下没这限制应该没问题了,可是功效却大跌眼镜,什么都没输出来,不解了
没有继承查了,问了下小同伴littlehann,接头了下, 没有对这个问题深究下去。而是提到递归这种运算在实际应用中的效率,确实除了讲义上很少看到利用递归的
原来的目标就只是求值,没想对它深究下去,照旧改用迭代吧,固然没太大印象了,不外一个for语句据可以搞定了
代码如下:
def calc(depth): tmp = 0 result = 1 for i in xrange(0,depth+1): cc = result if (cc ^ i)%4 == 0: tmp = 1 else: tmp = 0 result = result + (i)%7 + tmp return result final = calc(11589) print final
短短几行代码,一下子搞定了。想到上次口试的时候,tx的口试官问我算法,其时提到了用递归实现一个运算,再想想是不是也可以用迭代呢?
#p#分页标题#e#
时间已往好久了,其时的题目也记不太清楚了,可是本日的教导是:大大都(代码写得少,凭感受说的预计值)环境下,递归的效率是较量低下的,这一点可以确定,上课的
时候也有讲到过。利用迭代的效率明明要高过递归(迭代的详细观念记不太清楚了),起码用轮回,运算几十万次我可以必定没问题,可是即便我改了递归限制,照旧碰着了歇工
最后,再贴出一个python long VS C long long的链接,感乐趣的可以去看看