1. 程式人生 > >Java遞迴思想分析

Java遞迴思想分析

先舉個例子:定義一個 sumByMax(int max)方法,求 1+…+max 的和

這個例子簡單的來講就是將1到max的所有整數都加起來,如果先不考慮用遞迴,那麼這就是一個個重複的累加步驟可以用迴圈來解決:

public int sumByMax(int max){
        int result=0;
        while(max>=1){
            result+=max;
            max--;
        }
        return result;
}

而如果用遞迴,可以這樣:

public int sumByMax(int
max){ if(max>=2){ return max+sumByMax(max-1); }else{ return max; } }

對於for或者while迴圈,只是將重複的步驟利用迴圈來處理,迴圈處理完一個步驟後,又進行下一個類似的步驟,關鍵點是要找出迴圈的依據和各步驟的相同點(既要迴圈的部分),什麼情況下要繼續迴圈,什麼情況下要終止迴圈,如此例,從1到max有多少的整數就要迴圈多少次,這就是此例的迴圈依據,而此例中進行迴圈的重複操作是累加;
使用遞迴時,需先找出重複步驟之間的相同邏輯,然後將這些邏輯實現在一個方法中。
遞迴是在進行一個步驟,進行到某處時,通過呼叫自身進行分層,在下一層開始緊接著的下一個步驟,
如果下一層不是定義的最後一層,則會在相同的地方再次分層,直到進入最底層,如上例中,max如果
為5,在進行max為5的這一層操作時,將會執行addByMax(4),分層,下一層的max將為4,此時因為定義了max為1時
才為最底層,所以會繼續分層,這時max為3,再分,為2,再分,為1,到達最底層,然後
從最底層開始將各層的結果一次向上傳遞,迴歸到最頂層,返回最終結果

所以遞迴時要注意形成一層一層的結構,一般會採取某種判斷的方法,如if,如果不滿足要求
,那就呼叫自身進行遞迴,此時應注意找出上下層之間的聯絡(各層相同邏輯的部分),讓運算進入下一層,
這樣形成上一層呼叫下一層,比如此例中的 max+addByMax(max-1)
最後注意定義一個最底層,即開始向上迴歸結果的那一層,最底層將不再呼叫自身進行遞迴

相關推薦

Java思想分析

先舉個例子:定義一個 sumByMax(int max)方法,求 1+…+max 的和 這個例子簡單的來講就是將1到max的所有整數都加起來,如果先不考慮用遞迴,那麼這就是一個個重複的累加步驟可以用迴圈來解決: public int sumByMax(int

Java思想倒置陣列

public class ReverseArry { public static void main(String[] args){ int[] arr = {1,2,3,4,5,6,7,8,9}; //System.out.println(arr.l

通過java思想實現以樹形方式展現出該目錄中的所有子目錄和檔案

當初在開始接觸Java時  學習File部分的一個小練習  挺有意思 一開始是通過看 北京聖思園 張龍老師的視訊開始學校java的,必須強烈推薦,真很棒。 功能實現:主要實現以樹形方式展現出該目錄中的所有子目錄和檔案。 另外, 在展現的時候將目錄排在上面,檔案排在下面。每一層要加上縮排。 檔案是jre6資料

java中的思想及應用

遞迴就是自己調自己,最需要注意的就是結束條件,否則可能就是死迴圈,導致記憶體溢位 public T a(Object x,Object y) {   if(條件true) {   a(x1,y1); } else {   return f(x,y);

Java中的原理分析

參加工作已經三四年了,再回頭來看這些很基礎的東西,覺得理解又深入了一層! 解釋:程式呼叫自身的程式設計技巧叫做遞迴。 程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式設計語言中廣泛應用。 一個過程或函式在其定義或說明中有直接或間接呼叫自

Java實現圍棋提子思想

在製作圍棋遊戲的時候 一般來說會有兩個問題 圍棋提子的演算法思想 Ai走子的演算法思想 由於ai走子的演算法思想確實太過於難了,牽扯到深度學習的東西 這裡就不進行闡述了 畢竟我也根本不會 我將闡述的是圍棋提子的思想 我是使用遞迴的思想來解決的

java基於思想的檔案拷貝

這段程式碼原本目的是掃描是否插入U盤,插入的話,自動將U盤檔案全部備份到目標資料夾中。檔案目錄是樹狀結構,很有層次感,且每層操作大致相同。複製目錄中的檔案,不是建立資料夾操作,就是複製檔案操作,所以遞迴

Java練習

public class TestDiGui { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(f(5));

思想和例項

先給一個簡單的階乘例子: public static int getDg(int x){ System.out.println(x); if (x==1) { return 1; } if (x<4) { return x * getDg(x-1);

Java刪除空資料夾

import java.io.File; public class ClearFile { static int iFile = 0; public static void main(String[] args) { // TODO Auto-generated method s

java簡單例項

1.自己的第一篇部落格,想把自己的覺得有用的記錄下來,也可以鍛鍊自己的表達能力。內容談不上豐富,如果寫的不好,請大家多多包涵。 2.廢話不多說,就是幹,先準備下指令碼 drop TABLE IF EXISTS category; CREATE TABLE `category` ( &nb

JAVA——實現n的階乘

n的階乘的演算法:n*(n-1)*(n-2)… *1 例如5的階乘為:5 * 4 *3 * 2 * 1 程式碼如下: //遞迴實現n的階乘 import java.util.Scanner; public class Factorial1{ //實現階乘的方法——使用遞迴 //要接收一

深入理解思想

1、什麼是遞迴 本質上,將原來的問題轉換為更小的同一問題。問題規模可以不斷縮小,直到達到一個不能再縮小的基本問題,解決這個基本問題,就解決了整個問題。 例如,使用遞迴思想對自然數1、2、3…n-1 、n求和: sum(n) = n +sum(n-1); //sum(n-1)就是被

呼叫分析-最大自序列求和問題

昨天開始看《資料結構與演算法分析-java語言描述》這本書,在第二章舉例了一個演算法問題“最大子序列和問題”,在第三種遞迴方法,由於開始並沒有很好理解,遞迴呼叫在演算法中有很重要,用了最簡單一個例子來加深理解!(當然這種方法在這四種演算法中不是最優的)。 先給出原始碼: package

列印連結串列(學習思想)——牛客

題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 問題分析 注意從尾到頭,這個很符合棧的特性——FILO,考慮用棧。既然想到用棧的形式,可以聯想到遞迴方法,最終確定為遞迴解決本題。 程式碼實現 直接使用當前函式 clas

Java刪除指定資料夾下所有檔案

Java遞迴刪除指定資料夾下所有檔案 工具類封裝 public class FileUtils{ public static boolean delAllFile(String path) { return delAllFile(new File(path)

java:練習(斐波那契數列)

package com.heima.test; public class Test5 { public static void main(String[] args) { demo1(); System.out.println(fun(8)); } //使用陣列求斐波那契數列

平衡二叉樹的java實現

平衡二叉樹的操作難點在於如何調整平衡,根據情況可以分為LL、RR、LR、RL旋轉四種方法,這是java的遞迴版本,後面打算用非遞迴實現一下,此部落格是根據部落格:http://blog.csdn.net/javazejian整理而成,原部落格圖文並茂,應該是花了不少心思研究,講得也非常詳細,特此整理

java之漢諾塔問題

原始碼的github地址,可以下載到本地執行 package stack.demo; /** * 漢諾塔問題: * 假設有三根柱子,x y z * x上有3個圓盤,從底部開始從大到小編號為n 到 1 * 若每次只能移動一個圓盤,且大圓盤不能在小圓盤上面 * 現在需要將3個

java (剛剛學習java

 輸入n個數,然後倒著輸出來: import java.util.*; public class Main { static Scanner cin = new Scanner(System.in); static void dfs(int n) { if(n>0) {