再帰と尾再帰の原理について

2287 ワード

基礎はとても重要で、これは永遠に変わらない真理です.

package sunfa;

public class DiGui {
	public static void main(String[] args) {
		Stack<Integer> stack = new Stack<Integer>(5);
		for (int i = 0; i < 5; i++) {
			stack.push(i);
		}
		System.out.println("dg:");
		dg(stack);
		System.out.println("jc:");
		System.out.println(jc(10));
		System.gc();
		System.out.println("wjc:");
		int r = 1;
		System.out.println(wjc(10, r));
	}

	/*
	 *   :              。
	 * 
	 *         ,                         ,                           ,
	 *                                     。
	 * 
	 *   :             (         ),               ,               
	 *       ,             。
	 * 
	 *   :          、             (            )            。
	 */
	private static void dg(Stack<Integer> stack) {
		if (stack.count() > 0) {
			Object o = stack.poll();
			dg(stack);
			System.out.println(o);
		}
	}
	private static void fdg(Stack<Integer> stack) {
		while (stack.count() > 0) {
			Object o = stack.poll();
			dg(stack);
			System.out.println(o);
		}
	}
	/*
	 *     :
	 * jc(5)==>
	 * 5*jc(4)--->     
	 * 5*4*jc(3)--->    jc(4)      ,            ,   jc(4)=4*jc(3)      4*jc(3)  
	 * 5*4*3*jc(2)--->  
	 * 5*4*3*2*jc(1)--->  
	 * 5*4*3*2*jc(1)  ==>  n=1             1,         5*4*3*2*1,        ,
	 *              ,                   。
	 */
	private static int jc(int n) {
		if (n == 1)
			return 1;
		return n * jc(n - 1);
	}

	/*
	 *    :
	 * wjc(5,1)==>
	 * wjc(4,5)
	 * wjc(3,20)
	 * wjc(2,60)
	 * wjc(1,120)
	 *                 ,             。
	 * 
	 *    ,               ,            ,              ,     
	 *      ,             ,                              ,   
	 *    ,             ,         ,                     。
	 * 
	 */
	private static int wjc(int n, int r) {
		return n == 1 ? r : wjc(n - 1, r * n);
	}
}