本文目錄一覽:
Java里的遞歸方法是不是一定要是靜態方法啊?
java常用遞歸代碼
//Top代表樹的的根節點
private void showNodeList(CollectionNode topList){
for(Node top:topList)
{
//顯示頂點
System.out.println(top.getName());
//顯示子樹
showNodeList(top.getChildren())
}
}
所謂遞歸就是循環,就是調用你本身的循環體,需要一個出口,不然就是死循環。
請看一個簡單的例子
說明:此方法就是調用了遞歸,recursion(car,i)自已調用了自已的方法。從此方法中,可以先對它進行了傳遞參數,分別是car(值),i(對遞歸次數的控制),car=2*(car-3000)這是對car第一次的計算,用if判斷是否結束,在這個if判斷中把每次遞歸都放入car,進行計算的值返回。這個遞歸直到12次,計算car的值都放入了car中,打印出car的總和,結束(出口)
缺點:由此可見遞歸就是調用自已的,方法與方法之間,類與類之間都可以。當然那我們在使用其的時候,要聲明一個操作的終結點(出口)。遞歸調用會增加內存負擔,因為每次調用一回方法都要開闢一段棧空間(先進後出),知道該方法滿足條件後才釋放。有結束條件了,是非常好的,否則你的遞歸程序會因為棧空間不足而中止的。
壞處:因為遞歸需要你的操作系統中的堆和棧,所以空間消耗上要比非遞歸代碼要大的多,而且遞歸深度太大了,可能系統支撐不了。
用一個方法就可以取到下面所有的子樹的集合但方法中傳遞的時候傳遞的參數必須是集合,然後遍歷此集合,讓每一元素通過select * from Id=??去那其下面的子集合,然後遍歷出來的子集合直接作為一個參數傳遞你寫的這個方法中,也就是再此調用下此方法,這樣最後就可以把每一個分支中的集合都傳遞過來,最後拿到每個分支中的最後一個分支對象傳遞過來後,就發現這就是要For循環得到的對象。
Java程序調用自身叫做遞歸,所以不是一定要靜態。
java 遞歸
/**
* Given a String, return true if the following types of brackets are
* balanced and properly nested. () {} []
*
* @param str
* String
* @return true if bracket match success
*/
public static boolean bracketMatch(String str) {
if (str == null || “”.equals(str))
return true;
str = str.replaceAll(“[^\\[\\]\\(\\)\\{\\}]”, “”);
int len = str.length();
if (len == 0)
return true;
if (len % 2 != 0) {
return false;
}
StringBuilder prev = new StringBuilder(len);
StringBuilder back = new StringBuilder(len);
prev.append(str.charAt(0));
back.append(str.substring(1, str.length()));
return bracketMatch(prev, back, len);
}
/**
* like public bracketMatch
*
* @param prev
* The front half of the string
* @param back
* The back half of the string
* @param len
* length of String
* @return true if bracket match success
*/
private static boolean bracketMatch(StringBuilder prev, StringBuilder back,
int len) {
if (prev.length() len / 2)
return false;
// the first char in the back half of the string
char backFirst = back.charAt(0);
//the last char in the front half of the string
char prevLast = prev.charAt(prev.length() – 1);
// match ok
if ((backFirst == ‘]’ prevLast == ‘[‘)
|| (backFirst == ‘)’ prevLast == ‘(‘)
|| (backFirst == ‘}’ prevLast == ‘{‘)
|| (backFirst == ” prevLast == ”)) {
//delete two chars matched
prev.deleteCharAt(prev.length() – 1);
back.deleteCharAt(0);
len -= 2;
} else {
//move backFirst to the end of prev
prev.append(backFirst);
//delete the first char in the back
back.deleteCharAt(0);
}
if (back.length() == 0) {
if (prev.length() == 0) {
return true;
} else {
return false;
}
} else {
return bracketMatch(prev, back, len);
}
}
用java遞歸方法實現
1、遞歸做為一種算法在程序設計語言中廣泛使用,是指函數/過程/子程序在運行過程中直接或間接調用自身而產生的重入現象。
2、遞歸算法一般用於解決三類問題:
1)數據的定義是按遞歸定義的。(Fibonacci(斐波那契)的函數)
2)問題解法按遞歸算法實現。(回溯)
3)數據的結構形式是按遞歸定義的。(樹的遍歷,圖的搜索)
java遞歸的優點缺點
遞歸好處:代碼更簡潔清晰,可讀性更好
遞歸可讀性好這一點,對於初學者可能會反對。實際上遞歸的代碼更清晰,但是從學習的角度要理解遞歸真正發生的什麼,是如何調用的,調用層次和路線,調用堆棧中保存了什麼,可能是不容易。但是不可否認遞歸的代碼更簡潔。一般來說,一個人可能很容易的寫出前中後序的二叉樹遍歷的遞歸算法,要寫出相應的非遞歸算法就比較考驗水平了,恐怕至少一半的人搞不定。所以說遞歸代碼更簡潔明了。
遞歸壞處:由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多。而且,如果遞歸深度太大,可能系統撐不住。
個人覺得:非必要時不遞歸
JAVA中的遞歸方法,求講一下。
方法遞歸和循環語句差不多,打個比喻。方法遞歸是小明上樓拿東西,一樓,二樓,三樓……樓頂。在樓頂拿到想要的東西以後,你總不能直接跳下來吧。你得一層一層的返回下來。循環就是驢拉磨,你轉多少圈都是在原地。變化的只是盤子里的東西有變化。方法遞歸不會進入死循環,但陷的太深系統會崩潰。
答得不好抱歉
java遞歸問題
用map,key就是你的a1,a2,a3,value就是你的值
遞歸寫的時候就可以取key和value了
原創文章,作者:AUHYM,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/325278.html