import java.util.*;
import java.util.Scanner;
//本程序显示 递归方法调用的 trace 特性
public class StackTraceTest {
//计算某个数字的阶乘
public static int factorial(int n)
{
System.out.println("factorial("+n+"):");
Throwable t=new Throwable();
StackTraceElement[] frames=t.getStackTrace();//返回stack trace 元素的数组
//StackTraceElement:An element in a stack trace, as returned by Throwable.getStackTrace().
// 代表了stack trace 中的 一个元素,会通过Throwable.getStackTrace()返回
// Each element represents a single stack frame. All stack frames except for the one
//每个元素代表了一个单一的 stack frame 。除了stack 顶部的之外,所有的stack frames 均代表了一个方法的调用
// at the top of the stack represent a method invocation.
// The frame at the top of the stack represents the execution point at which the stack trace
//顶部的frame 代表着这个stack trace 被创建时候的执行点。
// was generated. Typically, this is the point at which the throwable corresponding to the
// stack trace was created.
for(StackTraceElement f:frames)
System.out.println(f);
int r=0;
if(n==0) r=0;
if(n==1) r=1;
else r=n*factorial(n-1);
System.out.println("return "+r);
return r;
}
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
System.out.println("Enter n : ");
int n=in.nextInt();
factorial(n);
}
}
运行时候:
Enter n :
3
即运算 3的阶乘,会输出以下:
factorial(3):
StackTraceTest.factorial(StackTraceTest.java:11)
StackTraceTest.main(StackTraceTest.java:36)
factorial(2):
StackTraceTest.factorial(StackTraceTest.java:11)
StackTraceTest.factorial(StackTraceTest.java:27)
StackTraceTest.main(StackTraceTest.java:36)
factorial(1):
StackTraceTest.factorial(StackTraceTest.java:11)
StackTraceTest.factorial(StackTraceTest.java:27)
StackTraceTest.factorial(StackTraceTest.java:27)
StackTraceTest.main(StackTraceTest.java:36)
return 1
return 2
return 6
这程序有点复杂,我被搞晕了!