人瞭解迭代,神瞭解遞歸。
1.介紹
- 遞歸指的是調用自己的函數。每個遞歸函數都有兩部分:基線條件(base case)和遞歸條件(recursive case)。遞歸條件指的是函數調用自己,而基線條件則指的是函數不再調用自己,從而避免形成無限循環。
可以藉助理解循環來理解遞歸:
舉個栗子,你用你手中的鑰匙打開一扇門,結果去發現前方還有一扇門,緊接着你又用鑰匙打開了這扇門,然後你又看到一扇們…(這是前行階段)但是當你開到某扇門時,發現前方是一堵牆無路可走了,你選擇原路返回(回退階段)——這就是遞歸
但是如果你打開一扇門後,同樣發現前方也有一扇們,緊接着你又打開下一扇門…但是卻一直沒有碰到盡頭——這就是循環。
- 簡單來說,循環是有去無回,而遞歸則是有去有回(因爲存在終止條件)。
2.示例
/**
* @author sjf
* @date 2020/2/29 19:57
*/
public class recursion {
public static void main(String[] args) {
System.out.print("我激動地抱住");
f(3);
}
public static void f(int n ){
if(n==1) {
System.out.print("我的抱枕");
return;
}
System.out.print("抱着");
else
f(n-1);
System.out.print("的我");
}
}
上述代碼的運行結果:
代碼其實十分簡單,但是需要理解的是:if
代碼塊的條件(n==1)
爲遞歸調用的終止條件,在else
代碼塊內自調用函數.我們前面有說到遞歸的過程是存在前行和退回階段的,那麼在前行階段我們在每次調用函數後,打印出了”抱着”,並且當n!=1
時重新調用該函數。n==1
時,可以理解爲遇見了一堵牆無路可走,執行System.out.print("我的抱枕");
,開始進入回退階段,在退回階段,將會去執行代碼System.out.print("的我");
最終輸出: 我激動地抱住抱着抱着我的抱枕的我的我
- **前行階段和回退階段圖示:
3.應用:
舉幾個我最近寫的題吧
1.合法括號
輸出 n個括號的 所有排列形式
1 ()
2 ()() , (())
3 ()()() , (()()) , ()(()) , (())() , ((()))
/*
n-的每個元素 都會有 左加 右加 外加 三種形式
set集合自動去重
*/
public static void main(String[] args) {
System.out.println(creat(3)); //[()()(), (()()), ()(()), (())(), ((()))]
}
public static Set creat(int n){
Set<String > s_n = new HashSet<>();
if(n==1) {
s_n.add("()");
return s_n;
}
Set<String> s_n1 = creat(n - 1);
for (String s : s_n1) {
s_n.add(s+"()");
s_n.add("()"+s);
s_n.add("("+s+")");
}
return s_n;
}
我們要求找出具有下列性質數的個數(包含輸入的自然數
先輸入一個自然數(n≤1000),然後對此自然數按照如下方法進行處理:
1.不作任何處理;
2.在它的左邊加上一個自然數,但該自然數不能超過原數的一半;
3.加上數後,繼續按此規則進行處理,直到不能再加自然數爲止.
輸入格式:
1個自然數n(n<=1000)
輸出格式:
1個整數,表示具有該形式的個數
6 6,16,26,126,36,136
6
/*
1
1 1
2
2 12 2 1+1 1 1+f(1)
3
3 13 2 1+1 1 1+f(1)
4
4 24 14 124 4 1+3 3=1+2 1+f(2)
5
5 25 15 125 4 1+3 3=1+2 1+f(2)
6
6,16,26,126,36,136 6 1+5 5=1+2+2 1+f(2)+f(3)
7
6 16 26 126 36 136 6 1+5 5=1+2+2 1+f(2)+f(3)
8
8 18 28 38 48 128 138 148 248 1248 1+9 9=1+2+2+4 1+f(2)+f(3)+f(4)
*/
public class exercise1 {
public static void main(String[] args) {
int n= new Scanner(System.in).nextInt();
int count = method(n);
System.out.println(count);
}
public static int method ( int temp) {
if ( temp == 1)
return 1;
if(temp == 2)
return 2;
else
return method(temp/2)+method(temp-2);
}
}