package lectures.class_dual_roles.statics;
import util.annotations.WebDocuments;
/**
 * LOOPING and RECURSIVE FACTORIAL
 * This class shows how one can compute a factorial, both
 * in a loop and recursively. 
 * There is no main method here.
 * The methods in this class are meant to be called directly or indirectly
 * by a main method in some other class.
 * As this class does not have a main method, do not try to run it.
 * 
 * ACCESS
 * We also see the kind of access classes have to each other when they are in 
 * different packages.
 * 
 * PUBLIC vs. DEFAULT ACCESS
 * The @WebDocuments({"Lectures/ClassDualRolesStatics.pptx", "Lectures/ClassDualRolesStatics.pdf", "Videos/ClassDualRolesStatics.avi"})
public keyword before a class or method (or variable) declaration gives 
 * it public access. If we omit the keyword, then we give it default access 
 * (which is different from private access).
 */
/**
 *
 * In the following class declaration, what happens if you remove the keyword public 
 * to specify default class access rather than public access. 
 * (Please do not put the keyword protected, it is banned from discussion until
 * we learn inheritance.) 
 *
 */
public class Factorials // public class access
//class Factorials // default class access, no access keyword

/**  
 * Do you get any compile errors in this file or in the classes
 * {StaticLoopingFactorialSpreadsheet}, which is the same package 
 * as this class and
 * {lectures.class_dual_roles_users.TwoStaticFactorialSpreadsheetUse},
 * which is in a separate package. 
 * You can hover over an error marker to see the corresponding message
 * and click on it to see a possible fix. 
 * 
 *  
 * T/F If classes C1 and C2 are in different packages, a method in C1 can call 
 * public methods in C2 if C2 has public access.
 * 
 * T/F If classes C1 and C2 are in different packages, a method in C1 can call 
 * public methods in C2 if C2 has default access.
 * 
 * T/F If classes C1 and C2 are in the same package, a method in C1 can call 
 * public methods in C2 if C2 has default access
 * 
 * T/F One of the roles of a package is to create walls around its component 
 * classes to restrict accesses to these classes (and its members) from 
 * classes in other packages.
 * 
 */
{
    /**
     * In the following method declaration, what happens if you remove the 
     * keyword public to give default access to the method loopingFactorial.
     * What happens if you choose private instead?
     *  
     */ 
    public static long loopingFactorial(int aNumber)
//  static long loopingFactorial(int aNumber) // default access to loopingFactorial
//  private static long loopingFactorial(int aNumber) // default access to loopingFactorial
    
    /**  
     * Do you get any compile errors in this file or in the class
     * {StaticLoopingFactorialSpreadsheet} which is in the same pacdkahe?
     * You can hover over an error marker to see the corresponding message. 
     * 
     * T/F If classes C1 and C2 are in the same package 
     * a method in C1 can call methods in C2 with default access. 
     * 
     * T/F If classes C1 and C2 are in the same package 
     * a method in C1 can call  methods in C2 with private access.
     * 
     * T/F One of the roles of a class is to create walls around its component 
     * methods to restrict accesses to these methods from 
     * classes in the same package.
     */ 

    {
        long aFactorial = 1;
        while (aNumber > 0) {
            aFactorial *= aNumber;
            aNumber -= 1;
        }
        return aFactorial;

    }
    public static long recursingFactorial(int aNumber) {
        /*
         * Base case, this means no recursive call takes place.
         * There can be multiple base cases in a recursive method
         */
        if (aNumber <= 1) {
            return 1;
        }
        /*
         * Recursive case
         */
        return aNumber*recursingFactorial(aNumber-1);       
    }
}
// Go next to: {@Permutations} (F3 or CTRL/Command Click on its name)