搜尋
首頁後端開發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
Python與C:學習曲線和易用性Python與C:學習曲線和易用性Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python vs. C:內存管理和控制Python vs. C:內存管理和控制Apr 19, 2025 am 12:17 AM

Python和C 在内存管理和控制方面的差异显著。1.Python使用自动内存管理,基于引用计数和垃圾回收,简化了程序员的工作。2.C 则要求手动管理内存,提供更多控制权但增加了复杂性和出错风险。选择哪种语言应基于项目需求和团队技术栈。

科學計算的Python:詳細的外觀科學計算的Python:詳細的外觀Apr 19, 2025 am 12:15 AM

Python在科學計算中的應用包括數據分析、機器學習、數值模擬和可視化。 1.Numpy提供高效的多維數組和數學函數。 2.SciPy擴展Numpy功能,提供優化和線性代數工具。 3.Pandas用於數據處理和分析。 4.Matplotlib用於生成各種圖表和可視化結果。

Python和C:找到合適的工具Python和C:找到合適的工具Apr 19, 2025 am 12:04 AM

選擇Python還是C 取決於項目需求:1)Python適合快速開發、數據科學和腳本編寫,因其簡潔語法和豐富庫;2)C 適用於需要高性能和底層控制的場景,如係統編程和遊戲開發,因其編譯型和手動內存管理。

數據科學和機器學習的Python數據科學和機器學習的PythonApr 19, 2025 am 12:02 AM

Python在數據科學和機器學習中的應用廣泛,主要依賴於其簡潔性和強大的庫生態系統。 1)Pandas用於數據處理和分析,2)Numpy提供高效的數值計算,3)Scikit-learn用於機器學習模型構建和優化,這些庫讓Python成為數據科學和機器學習的理想工具。

學習Python:2小時的每日學習是否足夠?學習Python:2小時的每日學習是否足夠?Apr 18, 2025 am 12:22 AM

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Web開發的Python:關鍵應用程序Web開發的Python:關鍵應用程序Apr 18, 2025 am 12:20 AM

Python在Web開發中的關鍵應用包括使用Django和Flask框架、API開發、數據分析與可視化、機器學習與AI、以及性能優化。 1.Django和Flask框架:Django適合快速開發複雜應用,Flask適用於小型或高度自定義項目。 2.API開發:使用Flask或DjangoRESTFramework構建RESTfulAPI。 3.數據分析與可視化:利用Python處理數據並通過Web界面展示。 4.機器學習與AI:Python用於構建智能Web應用。 5.性能優化:通過異步編程、緩存和代碼優

Python vs.C:探索性能和效率Python vs.C:探索性能和效率Apr 18, 2025 am 12:20 AM

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

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

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。