猿问

使用while循环检查进行递归

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


实际发生的是,在num等于endNum并且if-condition在“ numberToPrint”方法中变为真,并继续向前进时return,并没有停止在此处实现“ numberToPrint”方法,并立即切换到第23行,实际的递归会发生。


有什么问题吗?为什么不停止在return真正的if条件下?


//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;

        }

    }

}



扬帆大鱼
浏览 191回答 1
1回答

月关宝盒

您的while循环不知道num值的变化,因此这里有一个infitite循环。这是由于num参数的本地作用域。当您将其传递给numberToPrint函数时,您正在使用其值的副本。而且,您永远不会用返回的值更新num。public class recursion {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; &nbsp; Integer num = 1;&nbsp; &nbsp; &nbsp; &nbsp; while (num<= endNum){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num = numberToPrint(endNum, num); // update num value&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public static int numberToPrint(int endNum, int num) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.print(num + ", ");&nbsp; &nbsp; &nbsp; &nbsp; if (num >= endNum) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return num;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return num + 1;&nbsp;&nbsp; &nbsp; }}您在这里混合了递归和迭代。我会选择其中之一,因为在这里它们会产生大量指令。通过递归,它看起来像这样:&nbsp; &nbsp; Integer num = 1;&nbsp; &nbsp; numberToPrint(endNum, num);}public static int numberToPrint(int endNum, int num) {&nbsp; &nbsp; System.out.print(num + ", ");&nbsp; &nbsp; if (num >= endNum) {&nbsp; &nbsp; &nbsp; &nbsp; return num;&nbsp; &nbsp; }&nbsp;&nbsp; &nbsp; return numberToPrint(endNum, (num + 1));}
随时随地看视频慕课网APP

相关分类

Java
我要回答