再帰と尾再帰の原理について
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);
}
}