当前位置:天才代写 > tutorial > Python教程 > python中的迭代与递归

python中的迭代与递归

2017-11-02 08:00 星期四 所属: Python教程 浏览:44

碰着一个环境,需要举办递归操纵,可是呢递归次数很是大,有一万多次。先不说一万多次递归,本来的测试代码是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的链接,感乐趣的可以去看看

 

    关键字:


天才代写-代写联系方式