再帰的には元々so easy_;-連載が可能だった(3)


今回はいくつかの例を通して、再帰的な理解と熟練を深めます。
前回の練習問題があります。再帰逆順で全体のデータを含むチェーンを出力します。
まずこの練習問題を完成します。
プログラマにとって、コードは一番いいコミュニケーションツールです。何も言わないで、コードを付けます。
public class Hello {    
    public static void main(String[] args) {
        LinkedList list=createLinkedList();
        //list.print();     
        list.revertPrint();//    
    }   
    /*      ,    */
    public static LinkedList createLinkedList() {
        LinkedList list=new LinkedList();
        for(int i=11;i<=20;i++) {
            list.add(i);
        }
        return list;
    }
}

package test;

/**
 *             
 */
public class LinkedList {
    //    Node,       
    private class Node {
        Node next; //    
        public int data;//    

        public Node(int data) {
            this.data = data;
            this.next = null;
        }
    }
    // ----
    public Node head = null; //    

    //         
    public void add(int data) {
        Node nodeNew = new Node(data);
        if (null == head) {
            head = nodeNew;
            return;
        }
        Node pre = head;
        Node p = head.next;
        while (p != null) {
            pre = p;
            p = p.next;
        }
        pre.next = nodeNew;
    }

    //     
    public void print() {
        Node p = head;
        while (p != null) {
            System.out.print(p.data + " ");
            p = p.next;
        }
    }

    //     
    public void revertPrint() {
        rP(head);
    }

    //     
    public void rP(Node node) {
        if (null == node)
            return;
        rP(node.next);
        System.out.print(node.data + " ");
    }
}
整数逆順序出力
例えば:
入力整数1234、出力は4321です。
入力整数7890、出力は0957です。
問題を解く:
このように見られます。
まずその数の桁数を出力します。
この数/10後の商を、またこの商の位に出力します。
これをもって、商が0である(つまり最高位/10の商)まで送り続けます。
コード:
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("       ");
        int n=sc.nextInt();
        if(n==0) {
            System.out.println(0);
            return;
        }else if(n<0) {
            System.out.print('-');
            n=0-n;
        }
        p(n);
    }

    static void p(int n) {
        if(n==0)
            return;
        System.out.print(n%10);
        p(n/10);
    }
思考問題:
正の整数の各数字の和を出力します。
例えば、入力1234、出力10。
整数逆順出力の考え方を参照してください。
階段をのぼる
問題の説明
階段はN階あります。上の階は1階に上がることができます。2階に上がることもできます。一つのプログラムを作って、計算すると、いくつかの違った歩き方があります。
問題を解く:
分析してみます。階段は1つしかないです。2つの歩法があります。1回に2つの階段を歩くか、2回に1つの階段を歩くか、2つの歩法があります。1つの階段を先に行くと3-1=2つの階段が残ります。歩法は2階の歩数に等しいので、先に2つの階段があります。3-2=1つの階段が残っています。歩数が一段階の歩数に等しいのは、足し算の原理によると、f 3=f(3-1)+f(3-2)四段の階段です。2種類の歩法があります。1段先に4-1=3段が残っています。歩数は三段の歩数に等しいので、2段先に行くと、4-2=2段が残っています。計算式は、f(n)=f(n-1)+f(n-2)f(1)=1 f(2)=2です。
コード:
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("        ,      ");
        int n=sc.nextInt();
        int step=stair(n);
        System.out.println(step);
    }

    static int stair(int n){
        if(n==1)
            return 1; //    ,  1   
        if(n==2)
            return 2; //    , 2   
        return stair(n-1)+stair(n-2);
    }