Skip to main content
Engineering LibreTexts

13.8: Recursive Methods

  • Page ID
    18822
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    Now that we have conditional statements, we can explore one of the most magical things a program can do: recursion. Consider the following example:

    public static void countdown(int n) {
        if (n == 0) {
            System.out.println("Blastoff!");
        } else {
            System.out.println(n);
            countdown(n - 1);
        }
    }
    

    The name of the method is countdown; it takes a single integer as a parameter. If the parameter is zero, it displays the word “Blastoff”. Otherwise, it displays the number and then invokes itself, passing n - 1 as the argument. A method that invokes itself is called recursive.

    What happens if we invoke countdown(3) from main?

    The execution of countdown begins with n == 3, and since n is not zero, it displays the value 3, and then invokes itself...
    The execution of countdown begins with n == 2, and since n is not zero, it displays the value 2, and then invokes itself...
    The execution of countdown begins with n == 1, and since n is not zero, it displays the value 1, and then invokes itself...
    The execution of countdown begins with n == 0, and since n is zero, it displays the word “Blastoff!” and then returns.
    The countdown that got n == 1 returns.
    The countdown that got n == 2 returns.
    The countdown that got n == 3 returns.

    And then you’re back in main. So the total output looks like:

    3
    2
    1
    Blastoff!
    

    As a second example, we’ll rewrite the methods newLine and threeLine from Section 4.3.

    public static void newLine() {
        System.out.println();
    }
    public static void threeLine() {
        newLine();
        newLine();
        newLine();
    }
    

    Although these methods work, they would not help if we wanted to display two newlines, or maybe 100. A better alternative would be:

    public static void nLines(int n) {
        if (n > 0) {
            System.out.println();
            nLines(n - 1);
        }
    }
    

    This method takes an integer, n, as a parameter and displays n newlines. The structure is similar to countdown. As long as n is greater than zero, it displays a newline and then invokes itself to display (n−1) additional newlines. The total number of newlines is 1 + (n − 1), which is just what we wanted: n.


    13.8: Recursive Methods is shared under a CC BY-NC-SA 3.0 license and was authored, remixed, and/or curated by Allen B. Downey (Green Tea Press) .

    • Was this article helpful?