python中的迭代與遞迴

來源:互聯網
上載者:User
遇到一個情況,需要進行遞迴操作,但是呢遞迴次數非常大,有一萬多次。先不說一萬多次遞迴,原來的測試代碼是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 = 7original = 28679718602997181072337614380936720482949array = ""result= ""while original !=0:    remainder = original % cimal    array += str(remainder)    original /= cimallength = 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 resultfinal = calc(11589)print final


短短几行代碼,一下子搞定了。想到上次面試的時候,tx的面試官問我演算法,當時提到了用遞迴實現一個運算,再想想是不是也可以用迭代呢?

時間過去很久了,當時的題目也記不太清楚了,但是今天的教訓是:大多數(代碼寫得少,憑感覺說的估計值)情況下,遞迴的效率是比較低下的,這一點可以確定,上課的

時候也有講到過。使用迭代的效率明顯要高過遞迴(迭代的具體概念記不太清楚了),起碼用迴圈,運算幾十萬次我可以肯定沒問題,但是即便我改了遞迴限制,還是遇到了罷工

最後,再貼出一個python long VS C long long的連結,感興趣的可以去看看

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.