前言
說起來,我寫這個系列的文章焚挠,與其說的技術文膏萧,不如說是就是自己再復習上課講過的內容,這些題做了也有一段時間了,在復習的同時榛泛,分享一下自己的成長與學習足跡蝌蹂,嘛,說不定也是一代大佬的成長之路曹锨。
這次還是遞歸孤个,上一篇用單個例子,這一篇就把自己做過的所有題都放上來沛简,相對還是挺簡單的齐鲤,據(jù)說面試喜歡考這個?不過代碼量確實是比較少的覆享,可以了解一下佳遂。最后面也會附上一道深度的題目。
注:題目來自我們親愛老班的OJ撒顿,若覺有不妥之地請務必聯(lián)系我丑罪,我可以立馬收起來......
遞歸(助理解的簡單例題)
例題一:
題目描述
給定數(shù)字n,n的半數(shù)序列集是(1)在 n 的右邊加上一個自然數(shù)凤壁,但該自然數(shù)不能超過最近添加的數(shù)的一半吩屹,這樣生了新的序列;(2)按此規(guī)則進行處理拧抖,直到不能再添加自然數(shù)為止煤搜。例如,4的半數(shù)序列集是{4唧席,4 2擦盾,4 2 1,4 1}淌哟。
輸入
一個整數(shù) n迹卢,(0<n<=50)。
輸出
按照數(shù)字降序徒仓,輸出集合所有序列腐碱,每個序列一行,每個數(shù)字后面跟一個空格掉弛。
樣例輸入
6
樣例輸出
6 3 1
6 3
6 2 1
6 2
6 1
6
來源
[計科老班]
先說說自己一開始的想法症见。題目的意思比較明顯,假設一個6殃饿,往后添加一個數(shù)是3(6/2=3>=3>0)谋作,之后這里6 3作為一個結果輸出,然后上一次的數(shù)變?yōu)榱?乎芳,那么往3后面加的數(shù)是1(3/2=1.5;1.5>=1>0)瓷们;再看別的情況6后面符合條件的數(shù)還有2(6/2=3>=2>0)业栅,以此類推,最后結果 再加上自己本身谬晕。
上一章說到過碘裕,像這種重復去生成并判斷一個數(shù)后面的數(shù)是否符合要求,可以用遞歸來實現(xiàn)攒钳,而且這題跟上一題還很相像帮孔,在遞歸方法中都需要一個循環(huán)去執(zhí)行遞歸,原因是能填入第二個位置的數(shù)有多個不撑,而在填入這個數(shù)之后又將執(zhí)行下一次數(shù)的填入文兢,依然是可能有多個的,加上上面的規(guī)律來看焕檬,不難判斷出我們需要的循環(huán)次數(shù)為n/2(n為輸入數(shù)據(jù))姆坚;
emmm,可能說的有些混亂实愚,畢竟能把人說懂這種操作是非常高端的兼呵。沒關系,文字之間我們可能沒有聯(lián)系腊敲,但是我相信代碼可以成為我們溝通不錯的橋梁击喂。
正文
import java.util.ArrayList;
public class Hyj1476 {
int[] result;
int n;
public Hyj1476(){
n = 6;
result = new int[n];
result[0] = n;
addNum(1,n);
System.out.println(n);
}
public void addNum(int index,int max){
for(int i=max/2;i>0;i--)
{
result[index] = i;
addNum(index+1,i);
for(int k=0;k<=index;k++)System.out.print(result[k]+" ");
System.out.println();
}
}
public static void main(String[] args){
new Hyj1476();
}
}
這里沒有用if條件判斷,而是直接在for循環(huán)之中輸出并通過每次傳進的i來判斷是否到達臨界條件碰辅,設置一個index下標懂昂,表示當前處于結果數(shù)組中的位置,這樣當輸出時就可以避免將數(shù)組后不需要的0當做輸出結果没宾。注意放在調用該方法下方輸出凌彬,在遞歸進入最里的臨界值時,若符合條件會輸出循衰,這樣就能顯示上面輸出樣例需要的格式饿序。