使用while循环检查进行递归

时间:2018-07-07 19:44:54

标签: java recursion while-loop

下面的代码用于打印1到用户输入的数字之间的数字。但是,当值num计数到等于endNum的地步时,while循环应该不再调用“ numberToPrint”方法。

实际上发生的是,在num等于endNum之后,如果“ numberToPrint”方法中的if条件变为true,并继续向return前进,则不会停止在此处实施“ numberToPrint”方法,然后立即切换到实际递归发生的第23行。

出什么问题了?为什么它不会在满足条件的return处停止?

//recursive printing of numbers from 1 to a user's number

import java.util.Scanner;

public class recursion {
    public static void main(String[] args) {
        System.out.print("Type a number from 1 to 20: ");
        Scanner input = new Scanner(System.in);
        Integer endNum = input.nextInt();
        System.out.println();
        Integer num = 1;
        while (num!=endNum){
            numberToPrint(endNum, num);
        }
    }

    public static int numberToPrint(int endNum, int num) {
        if (num == endNum) {
            System.out.print(num + ", ");
            return num;
        } else {
            System.out.print(num + ", ");
            numberToPrint(endNum, (num + 1));
            return num;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的while循环不知道num值的变化,因此这里有一个infitite循环。这是由于num参数的本地作用域。当您将其传递给numberToPrint函数时,您正在使用其值的副本。而且,您永远不会用返回的值更新num。

public class recursion {
    public static void main(String[] args) {
        ...
        Integer num = 1;
        while (num<= endNum){
            num = numberToPrint(endNum, num); // update num value
        }
    }

    public static int numberToPrint(int endNum, int num) {
         System.out.print(num + ", ");
        if (num >= endNum) {
            return num;
        } 
        return num + 1; 
    }
}

您在这里混合了递归和迭代。我会选择其中之一,因为在这里它们会产生大量指令。

通过递归,它看起来像这样:

    Integer num = 1;
    numberToPrint(endNum, num);
}

public static int numberToPrint(int endNum, int num) {
    System.out.print(num + ", ");
    if (num >= endNum) {
        return num;
    } 
    return numberToPrint(endNum, (num + 1));
}