package methods;
class FactorialD {
	int n;
	static String prefix="";
	public FactorialD(int n) {
		System.out.println(prefix + "> Factorial(" + n + ")");
		prefix = "| " + prefix;
		this.n=n;
		System.out.println(prefix + "Object: " + this);
		prefix = prefix.substring(2);
		System.out.println(prefix + "< implicit return=" + this);
	}
	public int value() {
		System.out.println(prefix + "> value() this=" + this);
		prefix = "| " + prefix;
		int ans=0;
		if (n<=2) ans =n;
		else ans= new FactorialD(n-1).value() * n;
		prefix = prefix.substring(2);
		System.out.println(prefix + "< return=" + ans);
		return ans;
	}
	static public void main(String args[]) {
		System.out.println(prefix + "> main(" + args[0] + ")");
		prefix = "| ";
		int n=Integer.parseInt(args[0]);
		System.out.println(prefix + "factorial(" + n +") = " + new FactorialD(n).value());
		System.out.println("< return void");
	}
	public String toString() {
		return "Factorial[n=" + n + "]";
	}
}