學習在白板上寫程序

數(shù)學歸納法摇展,用于證明斷言對所有自然數(shù)成立

  • 證明對于N=1成立
  • 證明N>1時:如果對于N-1成立熊痴,那么對于N成立

如何證明遞歸函數(shù)正確執(zhí)行

  • 數(shù)學歸納法中的數(shù)學徘铝、自然語言 <==> 程序語言

遞歸控制

  • 嚴格定義遞歸函數(shù)作用携冤,包括參數(shù)盆繁,返回值,Side-effect
  • 先一般,后特殊
  • 每次調(diào)用必須縮小問題規(guī)模(如果不這樣就成了死循環(huán))
  • 每次問題規(guī)脑派矗縮小程度必須為1

例一:鏈表創(chuàng)建

public class Node {

    private final int value;

    private Node next;

    //構造時將next默認為空
    public Node(int value) {
        this.value = value;
        this.next = null;
    }

    public int getValue() {
        return value;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    //打印鏈表
    public static void printLinkedList(Node head){
        while(head != null){
            System.out.print(head.getValue());
            System.out.print(" ");
            head = head.getNext();
        }
        System.out.println();
    }
}
public class LinkedListCreator {

    /**
     * Creates a linked list.遞歸
     * @param data the data to create the list
     * @return head of the linked list.The returned linked list
     * ends with last node with getNext() == null
     */
    public Node createLinkedList(List<Integer> data){
        if(data.isEmpty()){
            return null;
        }
        Node firstNode = new Node(data.get(0));
        firstNode.setNext(createLinkedList(data.subList(1,data.size())));
        return firstNode;
    }


    //測試創(chuàng)建鏈表
    public static void main(String[] args) {
        LinkedListCreator creator = new LinkedListCreator();
        Node.printLinkedList(creator.createLinkedList(new ArrayList<>()));
        Node.printLinkedList(creator.createLinkedList(Arrays.asList(1)));
        Node.printLinkedList(creator.createLinkedList(Arrays.asList(1,2,3,4,5)));

    }
}
  /**
     * 循環(huán)創(chuàng)建鏈表
     * @param data
     * @return
     */
    public Node createLinkedList2(List<Integer> data){
        if(data.isEmpty()){
            return null;
        }
        Node firstNode = new Node(data.get(0));
        //循環(huán)創(chuàng)建鏈表
        Node curNode = firstNode;
        for(int i=1;i<data.size();i++){
            Node nextNode = new Node(data.get(i));
            curNode.setNext(nextNode);
            curNode = nextNode;
        }
        return firstNode;
    }

例二:鏈表反轉(zhuǎn)

public class LinkedListReverser {

    /**
     * Reaverses a linked list. 遞歸
     * @param head the linked list to reverse
     * @return head of the reversed linked list
     */
    Node reverseLinkedList(Node head){
        //size == 0 size == 1
        if(head == null || head.getNext() == null){
            return head;
        }

        Node newHead = reverseLinkedList(head.getNext());
        head.getNext().setNext(head);
        head.setNext(null);
        return newHead;
    }

    public static void main(String[] args) {
        LinkedListCreator creator = new LinkedListCreator();
        LinkedListReverser reverser = new LinkedListReverser();
        Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(new ArrayList<>())));
        Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1))));
        Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1,2,3,4,5))));

    }
}
    /**
     * 循環(huán)反轉(zhuǎn)鏈表
     * @param head
     * @return
     */
    Node reverseLinkedList2(Node head){
        Node newHead = null;
        Node curHead = head;
        while(curHead != null){
          Node next = curHead.getNext();
          curHead.setNext(newHead);
          newHead = curHead;
          curHead = next;
        }
        return newHead;
    }

例三:列出所有組合

combinations([1,2,3,4],2)
要點:多個參數(shù)的初始值

public class Combinations {

    /**
     * Generates all combinations and output them,
     * selecting n elements from data.
     * @param data
     * @param n
     */
    public void combinations(List<Integer> selected,List<Integer> data, int n){
        //initial value for recursion
        //how to select elements
        //how to output

        if(n ==0 ){
            //output all selected elements
            for(Integer i: selected){
                System.out.print(i);
                System.out.print(" ");
            }
            System.out.println();
            return ;
        }
        if(data.isEmpty()){
            return ;
        }
        // select element 0
        selected.add(data.get(0));
        combinations(selected, data.subList(1,data.size()),n-1);
        // un-select element 0
        selected.remove(selected.size() - 1);
        combinations(selected, data.subList(1,data.size()),n);

    }

    public static void main(String[] args) {
        Combinations comb = new Combinations();
        comb.combinations(new ArrayList<>(),Arrays.asList(1,2,3,4),2);
        System.out.println("=========================");
        comb.combinations(new ArrayList<>(),new ArrayList<>(),0);
        System.out.println("=========================");
        comb.combinations(new ArrayList<>(),new ArrayList<>(),2);
        System.out.println("=========================");
        comb.combinations(new ArrayList<>(),Arrays.asList(1,2,3,4),1);
        System.out.println("=========================");
        comb.combinations(new ArrayList<>(),Arrays.asList(1,2,3,4),0);
        System.out.println("=========================");
    }

}

遞歸缺點:函數(shù)調(diào)用開銷大敬肚,可能會Stack Overflow!
不要嘗試遞歸->非遞歸

例四:鏈表刪除節(jié)點

public Node deleteIfEquals(Node head,int value){
        while(head!=null && head.getValue() == value){
            head = head.getNext();
        }
        Node prev = head;
        if(head == null){
            return null;
        }
        while(prev.getNext() != null){
            if(prev.getNext().getValue() == value){
                prev.setNext(prev.getNext().getNext());
            }else{
                prev = prev.getNext();
            }
        }
        return head;
    }

例: 二分查找

  • 在有序數(shù)組中查找元素K,返回K所在下標
  • binarySearch([1,2,10,15,100],15) == 3
   /**
     * 二分查找
     * @param arr 有序
     * @param k
     * @return
     */
    public int binarySearch(int[] arr,int k){

        int a = 0;
        int b = arr.length;
        //[a,b)
        while(a < b){
            //int m = (a + b) / 2;
            int m = a + (b - a) / 2;
            if(k < arr[m]){//a...(m-1)
                b = m;
            }else if(k > arr[m]){//(m+1)...b
                a = m + 1;
            }else{
                return m;
            }
        }
        return -1;
    }

二叉樹的遍歷

前序遍歷:ABDEGCF
中序遍歷:DBGEACF
后序遍歷:DGEBFCA

/**
 *  樹
 * @author WangCH
 * @create 2018-03-14 20:02
 */
public class TreeNode {

    private final char value;

    private TreeNode left;

    private TreeNode right;

    public TreeNode(char value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }

    public char getValue() {
        return value;
    }

    public TreeNode getLeft() {
        return left;
    }

    public void setLeft(TreeNode left) {
        this.left = left;
    }

    public TreeNode getRight() {
        return right;
    }

    public void setRight(TreeNode right) {
        this.right = right;
    }
}
/**
 * 手動創(chuàng)建二叉數(shù)
 * @author WangCH
 * @create 2018-03-14 20:03
 */
public class TreeCreator {

    public TreeNode createSampleTree(){
        TreeNode root = new TreeNode('A');
        root.setLeft(new TreeNode('B'));
        root.getLeft().setLeft(new TreeNode('D'));
        root.getLeft().setRight(new TreeNode('E'));
        root.getLeft().getRight().setLeft(new TreeNode('G'));
        root.setRight(new TreeNode('C'));
        root.getRight().setRight(new TreeNode('F'));
        return root;
    }
}
/**
 * @author WangCH
 * @create 2018-03-21 13:46
 */
public class TreeTraversal {

    /**
     * 前序遍歷二叉樹
     * @param root
     */
    public void preOrder(TreeNode root){
        if(root == null){
            return;
        }
        System.out.print(root.getValue());
        preOrder(root.getLeft());
        preOrder(root.getRight());
    }

    /**
     * 中序遍歷
     * @param root
     */
    public void inOrder(TreeNode root){
        if(root == null){
            return;
        }
        inOrder(root.getLeft());
        System.out.print(root.getValue());
        inOrder(root.getRight());
    }

    /**
     * 后序遍歷
     * @param root
     */
    public void postOrder(TreeNode root){
        if(root == null){
            return;
        }
        postOrder(root.getLeft());
        postOrder(root.getRight());
        System.out.print(root.getValue());
    }

    public static void main(String[] args) {
        TreeCreator creator = new TreeCreator();
        TreeNode sampleTree= creator.createSampleTree();

        TreeTraversal treeTraversal = new TreeTraversal();
        System.out.print("前序遍歷:");
        treeTraversal.preOrder(sampleTree);
        System.out.println();
        System.out.print("中序遍歷:");
        treeTraversal.inOrder(sampleTree);
        System.out.println();
        System.out.print("后序遍歷:");
        treeTraversal.postOrder(sampleTree);
        System.out.println();
    }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市束析,隨后出現(xiàn)的幾起案子艳馒,更是在濱河造成了極大的恐慌,老刑警劉巖员寇,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弄慰,死亡現(xiàn)場離奇詭異,居然都是意外死亡丁恭,警方通過查閱死者的電腦和手機曹动,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牲览,“玉大人,你說我怎么就攤上這事恶守〉谙祝” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵兔港,是天一觀的道長庸毫。 經(jīng)常有香客問我,道長衫樊,這世上最難降的妖魔是什么飒赃? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮科侈,結果婚禮上载佳,老公的妹妹穿的比我還像新娘。我一直安慰自己臀栈,他們只是感情好蔫慧,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著权薯,像睡著了一般姑躲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盟蚣,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天黍析,我揣著相機與錄音,去河邊找鬼屎开。 笑死阐枣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侮繁,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼虑粥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宪哩?” 一聲冷哼從身側(cè)響起娩贷,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锁孟,沒想到半個月后彬祖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡品抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年储笑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圆恤。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡突倍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盆昙,到底是詐尸還是另有隱情羽历,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布淡喜,位于F島的核電站秕磷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炼团。R本人自食惡果不足惜澎嚣,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘟芝。 院中可真熱鬧易桃,春花似錦、人聲如沸模狭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚼鹉。三九已至贩汉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锚赤,已是汗流浹背匹舞。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留线脚,地道東北人赐稽。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓叫榕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姊舵。 傳聞我的和親對象是個殘疾皇子晰绎,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 課程介紹 先修課:概率統(tǒng)計,程序設計實習括丁,集合論與圖論 后續(xù)課:算法分析與設計荞下,編譯原理,操作系統(tǒng)史飞,數(shù)據(jù)庫概論尖昏,人...
    ShellyWhen閱讀 2,299評論 0 3
  • 計算機中數(shù)的表示及進制轉(zhuǎn)換 數(shù)碼、基與權數(shù)碼:表示數(shù)的符號基:數(shù)碼的個數(shù)權:每一位所具有的值 各種進制之間的轉(zhuǎn)換 ...
    張輕舟閱讀 433評論 0 0
  • NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/...
    蔣昉霖閱讀 1,775評論 0 0
  • “一构资,二抽诉,三,好同學們干杯吐绵!干杯……愿大家研究生畢業(yè)之后迹淌,前程似錦,午馬凱達拦赠∥∩常”班長大峰,臉龐洋溢著醉醉的粉羞荷鼠。 ...
    馮少閱讀 828評論 0 1