首頁 後端開發 Python教學 詳解python中的迭代與遞歸方法

詳解python中的迭代與遞歸方法

Mar 17, 2017 pm 05:11 PM
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的面試官問我演算法,當時提到了用遞歸實作一個運算,再想想是不是也可以用迭代呢?

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

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

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


以上是詳解python中的迭代與遞歸方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

模板化的優點和缺點有哪些? 模板化的優點和缺點有哪些? May 08, 2024 pm 03:51 PM

模板化的優點和缺點有哪些?

Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2 Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2 Jul 01, 2024 am 07:22 AM

Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2

怎麼下載deepseek 小米 怎麼下載deepseek 小米 Feb 19, 2025 pm 05:27 PM

怎麼下載deepseek 小米

只要250美元,Hugging Face技術主管手把手教你微調Llama 3 只要250美元,Hugging Face技術主管手把手教你微調Llama 3 May 06, 2024 pm 03:52 PM

只要250美元,Hugging Face技術主管手把手教你微調Llama 3

分享幾個.NET開源的AI和LLM相關專案框架 分享幾個.NET開源的AI和LLM相關專案框架 May 06, 2024 pm 04:43 PM

分享幾個.NET開源的AI和LLM相關專案框架

golang 函數調試與分析的完整指南 golang 函數調試與分析的完整指南 May 06, 2024 pm 02:00 PM

golang 函數調試與分析的完整指南

deepseek怎麼問他 deepseek怎麼問他 Feb 19, 2025 pm 04:42 PM

deepseek怎麼問他

evaluate函數怎麼保存 evaluate函數怎麼保存 May 07, 2024 am 01:09 AM

evaluate函數怎麼保存

See all articles