學習編程的人,怎麼能不知道什麼叫遞歸?

2020-12-15 劉小愛

今天是我自學Java的第38天。

感謝你的觀看,謝謝你。

話不多說,開始今天的學習:

遞歸:不要看這個名字好像挺高大上的樣子,其實理解起來還是蠻容易的。

在學習遞歸之前,我們先學習下目錄的遍歷,遞歸的主要使用途徑就需要它。

一、目錄的遍歷

目錄,自然也就是指我們常說的文件夾了,一個文件夾裡面是可以有很多個子文件夾和子文件的。

如果遍歷目錄?有兩種方法:

1.目錄的遍歷:list方法

①創建一個文件對象

因為是目錄的遍歷,所以在路徑中填寫目錄的路徑。②list方法

list,列表的意思,一個文件夾裡面有幾個文件夾或者文件,這就是一個獲取文件夾裡的列表的方法。

返回一個String數組,表示該File目錄中的所有子文件或目錄。

③遍歷目錄

使用增強for循環,控制臺會輸出一個目錄列表。

2.目錄的遍歷:listFiles方法

①創建一個文件對象

②listFiles方法

返回一個File數組,表示該File目錄中的所有的子文件或目錄。

③遍歷目錄

使用增強for循環,控制臺會輸出一個目錄列表(帶完整路徑的)。

其中可以使用file的getName方法獲取文件名列表。

目錄的遍歷特點:

只能遍歷目錄,不能遍歷文件。listFiles方法更加地常用,因為file有各種各樣的方法,我們可以根據需求遍歷出不同的格式。因為File根據構造方法的路徑,既能表示成文件又能表示成目錄,如果填寫文件路徑會返回null,遍歷的話就會出現空指針異常。二、遞歸(recursion)

說到遞歸,先提一個數學裡的概念:階乘。

什麼叫階乘?

5的階乘:5!=5×4×3×2×1;

4的階乘:4!=4×3×2×1。

這就是階乘。

現有一個需求:求一個數的階乘?

1.for循環解決該需求

看到這個需求我的第一個反應就是for循環,事實上確實可以用循環語句解決:

①定義一個計算階乘的方法:getResult()。

②在getResult中,定義一個變量作為階乘的結果。

③for循環計算階乘,並返回結果。

注意:0!=1,而不是想當然的以為等於0;

至於為什麼為1,這是一個數學問題。

本質上n!=(n+1)!÷(n+1);

所以:0!=1!÷1=1。

那除了for循環還有沒有其他方法呢?

答案是有的,也就是遞歸。

2.遞歸解決該需求

①定義一個計算階乘的方法。

②i==0,0的階乘等於1,直接返回1。

③i>0時,找出其中的計算規律。

如果getResult(i-1)就是(i-1)!

那麼getResult(i)=i*getResult(i-1)。

看到沒有,什麼叫遞歸?

遞歸就是指在方法裡面調用自己的方法這種現象。

就像我們在數學中的找規律一樣,先把規律找出來,再創建方法。

④如果是負數,因為負數是沒有階乘的,直接返回-1,或者報錯。

遞歸注意點:

遞歸必須要有結束條件,不然的話就是死循環了。stackOverflowError : 棧溢出,如下圖:

因為遞歸指的是方法裡面調用自己的方法,如果一次性地調用次數過多會出現棧溢出的情況,並且這是一種錯誤,無法從代碼角度修改。

其中上述兩種方法中:

for循環的方法要更加地實用簡潔,使用遞歸的話效率會很低,一般使用的很少。

那為何還要學遞歸?

因為它在文件操作中會使用到它,並且既然是學習Java,也有必要理解下遞歸的概念。

三、遞歸刪除多級目錄

根據我們昨天學的File類中的方法。

刪除方法delete只能用來刪除文件和空文件夾,它是沒法直接刪除非空文件夾的。

那你可能要問了,那計算機裡面可以直接刪除一個非空文件夾的呀,它是怎麼做到的?

其實刪除非空文件夾的操作本質上就是:先將文件夾裡面的所有文件都刪除,等自己成一個空文件夾了,再刪除自己。

這個需求如何實現?

就需要使用到遞歸。

①創建file對象,定義一個deleteFile的方法

其中路徑為多級文件夾,所以不能用delete方法直接刪除,deleteFile方法可以用來刪除一個文件夾。

②delete方法中如果file對象是文件

是文件的話,可以使用delete方法直接刪除。

③如果是文件夾,我們需要遍歷

將文件夾遍歷,使用我們一開始學到的listFiles方法。

遍歷之後,文件夾裡面也是有可能既包含文件夾又包含文件的,還是要判斷,又回到了一開始的需求。

④遞歸

在方法裡直接調用自己的方法就好了。

⑤刪除空文件夾

因為文件夾裡的文件夾和文件都沒有了,就是一個空文件夾了,所以可以直接刪除。

總之,使用遞歸把握兩點:

如何結束遞歸?如何繼續遞歸?上述例子中:

如何結束遞歸?

當file對象是一個文件時(使用isFile方法),直接就可以刪除文件了,結束遞歸。

如何繼續遞歸?

我們是要刪除一個文件夾,使用了一個deleteFile方法。

因為一個文件夾裡面是可能既有文件夾又有文件的。

如果是文件,直接刪除。如果是文件夾,繼續使用deleteFile方法說白了,遞歸就是尋找邏輯點相同的地方,再自己調用自己的方法就好了。

總結

相關焦點

  • 計算機編程必備技巧——遞歸使用
    1、引言 今天我們來學習遞歸,如果單說學習算法, 遞歸併不能說是算法,而是一種編程的手法,為什麼現在要學習這個呢?因為後面在學習其他算法時,要牽涉一些遞歸的調用方法,是為以後理解學習的內容做好鋪墊。
  • 計算機編程必備技巧——使用遞歸
    1、引言今天我們來學習遞歸,如果單說學習算法, 遞歸併不能說是算法,而是一種編程的手法,為什麼現在要學習這個呢?因為後面在學習其他算法時,要牽涉一些遞歸的調用方法,是為以後理解學習的內容做好鋪墊。遞歸方法作為一種優雅的解題方法,是大多數程式設計師比較喜歡的編寫方式之一。
  • LabVIEW編程實例:計算階乘,學習for循環+移位寄存器+遞歸調用
    也可以用遞歸方式定義為如下形式:n!=(n-1)!×n,且0!=1根據這兩種定義方式,下面給出在LabVIEW中編程實現求解n!的兩種方法。階乘求解方法2:使用遞歸調用方法實現這種方法根據階乘的遞歸方式的定義進行實現。遞歸VI程序顧名思義是指一個VI在運行中可以調用自身的VI程序,在LabVIEW中可以容易的實現遞歸VI程序的設置。
  • C++數據結構學習:遞歸(2-1)
    正在閱讀:C++數據結構學習:遞歸(2-1)C++數據結構學習:遞歸(2-1)2004-02-14 09:34出處:PConline作者:happycock/CSDN責任編輯:linjixiong漢諾塔的非遞歸解法似乎這個問題的最佳解法就是遞歸
  • Python進階之遞歸函數的用法及其示例
    遞歸是指函數/過程/子程序在運行過程序中直接或間接調用自身而產生的重入現象。在計算機編程裡,遞歸指的是一個過程:函數不斷引用自身,直到引用的對象已知。使用遞歸解決問題,思路清晰,代碼少。但是在主流高級語言中(如C語言、Pascal語言等)使用遞歸算法要耗用更多的棧空間,所以在堆棧尺寸受限制時(如嵌入式系統或者內核態編程),應避免採用。所有的遞歸算法都可以改寫成與之等價的非遞歸算法。
  • 少兒Python編程培訓手冊系列之——函數的定義及遞歸思想
    有了函數:模塊化編程,可以使代碼的層次更清晰。函數分系統函數(內置函數、內建函數)和自定義函數。01系統函數系統函數,也叫內置函數或內建函數,也就是軟體的開發人員已經定義好的函數,我們只需要拿過來使用就可以了。
  • 「通俗易懂的文字」+「經典的案例」希望能讓你順利入門「遞歸算法」
    遞歸是非常常見的一種算法,非常經典,可以解決非常多的問題。但我估計雖然大部分人知道遞歸,也能看得懂遞歸,但在實際運用中,很容易被遞歸給搞暈(數據,變量,函數等來回的出棧入棧)。今天寫篇文章分享下,或許,能夠給你帶來一些幫助。
  • python算法遞歸於尾遞歸!
    遞歸概念遞歸:程序調用自身的編程技巧稱為遞歸( recursion)。用一種通俗的話來說就是自己調用自己,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的、但是規模較小的問題來求解,當問題小到一定規模的時候,需要一個遞歸出口返回。
  • 兒童編程怎麼用起來,對著電腦不知道幹什麼,怎麼找編程思路?
    嗨嘍,大家好,我是阿戴,歡迎來到編程之家,帶你一起學習scratch編程入門知識,更多內容會陸續更新,兒童編程的重要性我就不多說了,多學點東西,肯定是沒錯的,下面開始學習今天的課程。,就像學會了走路,讓他們站在馬路上不知道該如何去走?
  • 如何理解遞歸?
    作者:劉半仙  來源:http://1t.click/eWx# 遞歸是什麼?定義:程序調用自身的編程技巧稱為遞歸。它分為調用階段和回退階段,遞歸的回退順序是它調用順序的逆序。遞歸使用的是選擇結構:if/switch。而for,while,do while使用的是循環結構。
  • C語言的「遞歸函數」這麼難理解,為什麼不丟棄它呢?
    初學者在學習C語言的過程中,遇到「遞歸」的概念時,常常會感到迷惑。坦誠地說,「遞歸」在程式語言中的確是一個比較難理解的概念,而且「遞歸」能解決的問題,一般循環語句也能解決,從某種程度上來說,C語言中的「遞歸」和循環語句是等價的,既然如此,為什麼C語言不「丟棄」難以理解的「遞歸」呢?
  • 高斯求和如何用遞歸實現,Python詳解遞歸那些事,看這1篇足夠!
    前段時間,有小夥伴留言,想了解一些有關Python遞歸函數的知識。最近,小編也惡補了一些這方面的內容。說實話,對於遞歸的認識過程,確實能讓我們從中探索出一些很有意思的內容。今天,我們來一探究竟。01什麼是遞歸?關於遞歸,網上有一大堆描述資料,很專業,也很詳細。感興趣的小夥伴可以隨手搜一搜。
  • memoization:讓遞歸算法更高效
    21CTO導讀:本文為學習如何使用稱為memoization的技術通過動態編程使遞歸算法變得高效。
  • 編程零基礎想做一名程式設計師,該怎麼學習?首先要學習什麼?
    程式設計師工資高還不需要和複雜的社會打交道。那麼作為一個零基礎,什麼都不懂的人該怎麼成為一名程式設計師?當程式設計師需要學什麼?下面就來分析下。零基礎的我該如何學習?如果想做一個程式設計師,在沒有基礎的情況下,買書自學是一個辦法,但是大多數人會因為沒有相關的基礎知識,導致看書看得一知半解,因為有不同的語言,不同的開發環境,在你不了解的時候,買的書不一定合適。
  • 零基礎入門深度學習 |最終篇:遞歸神經網絡
    無論即將到來的是大數據時代還是人工智慧時代,亦或是傳統行業使用人工智慧在雲上處理大數據的時代,作為一個有理想有追求的程式設計師,不懂深度學習(Deep
  • python遞歸算法(上)
    什麼是遞歸在函數內部,是可以調用其他函數的。如果一個函數在內部調用自身,就稱這個函數就是遞歸函數。舉個例子:實現一個可以自定義重複列印你好的函數。原理很好理解,就是不斷的調用自身,如果前面不加上if條件判斷,理論上是會陷入死循環的,但是實際上遞歸到一定次數(最大遞歸次數)就會報錯停止。遞歸有什麼用知道遞歸是怎麼回事,那麼遞歸有什麼實際用處嘛,或者說有什麼獨特之處。
  • 學習計算機程式語言最好的方法是什麼?
    1、有的人喜歡邊看書邊寫代碼,學一節就做做小練習,學一章就來個綜合點兒的練習,爭取能覆蓋大部分語法和知識點;2、還有的人就喜歡先將整個教程或者教材進行通篇的學習筆記,最後才挑感興趣的部分寫點兒代碼練習一下,然後找一個熟悉的需求用所學的程式語言來實現一下,對用到的部分反覆研究;3、有的人就只是看書、看視頻、看博客,全都看個遍,始終不動手,直到做實際項目時才開始寫代碼
  • 學習編程能讓孩子更好的面對未來多元化的生活
    雖然很多家長都知道學習編程對孩子有幫助,但是卻不知道編程的具體作用是什麼 很多孩子在學完編程後,做計算題都嚴謹了很多,很少出現本來已經會的題目因為疏忽導致失分。通過了解才知道,編程寫多了,在不知不覺中養成了嚴謹的習慣,徹底遠離了「差不多先生」。
  • 我是計算機專業的,身邊沒有一個是在三年級前讓孩子學編程的……
    機器人教育如火如荼,各種線上編程的廣告隨處可見。但是幼兒園就開始學編程打比賽真的能讓孩子真正理解編程嗎?知乎一位網友,自己是計算專業畢業的,結合自己學習編程的經歷,聊了聊自家小孩是怎麼學編程…順便文末說說你怎麼看,你會讓孩子幼兒園就開始學編程嗎?
  • 函數式編程聖經
    人類迷惑不解:「有沒有搞錯, 我們怎麼寫循環?」上帝說:「你們用循環幹什麼?」人類說:「這雖然能完成工作,但是好像不太直觀啊!再說,親愛的上帝,如果我那個list容量很大,遞歸層次很深,會不會出現棧溢出?」上帝說:「沒事,我有尾遞歸,保證不溢出。這種遞歸的寫法,你們慢慢就習慣了。」