【问题标题】:Java Recursion and ReturnsJava 递归和返回
【发布时间】:2014-12-25 18:43:48
【问题描述】:

在我的 java 课程中我们没有做太多的递归,但我想了解它,所以我写了一个小测试程序。程序的问题是getLengthgetWidth方法被递归调用后,没有使用用户在return语句中的输入,导致displayArea方法返回面积为0.0。如果您能指出我的错误和/或解决方案,那将很有帮助。下面是代码:

package recursiontest;

import java.util.Scanner;
public class RecursionTest 
{

    static void main(String[] args) {
        // TODO code application logic here
        double length = getLength();
        double width = getWidth();
        double area = getDimensions(length, width);
        displayArea(area);
    }

    public static double getLength(){
        double length = 0;
        Scanner in = new Scanner(System.in);
        System.out.print("Please enter the rectangle's length: ");
        if(in.hasNextDouble()){
            length = in.nextDouble();
        }
        else{
            System.out.println("Input must be a double.");
            getLength();
        }
        return length;
    }

    public static double getWidth(){
        double width = 0;
        Scanner in = new Scanner(System.in);
        System.out.print("Please enter the rectangle's width: ");
        if(in.hasNextDouble()){
            width = in.nextDouble();
        }
        else{
            System.out.println("Input must be a double.");
            getWidth();
        }
        return width;
    }

    public static double getDimensions(double length, double width){
        double area = 0;
        area = length * width;
        return area;
    }

    public static void displayArea(double area){
        System.out.println("Area = "+area);
    }
}

【问题讨论】:

  • 我会说这是一个不好的递归情况,因为用户可以通过输入无效值导致堆栈溢出。
  • @clcto 正如你所说,这可能是一个糟糕的案例,我对溢出问题了解不多。但我只是使用我已经编写的一个基本程序来了解递归是如何被调用的,所以它达到了它的目的。随意离开并回答或评论带有更正确的递归实现的链接,正如我在上面的代码中所说,我的课程并没有真正涉及递归,但我想了解它,所以更多信息将不胜感激.感谢您花时间查看我的帖子。
  • 正确的解决方案(在我看来)是使用递归。只是一个当输入有效时中断的while循环。每当您调用一个函数时,它会将更多信息推送到堆栈中,而当您离开该函数时,它会从堆栈中删除该信息。由于堆栈可以具有一些最大大小,如果您一遍又一遍地调用函数而没有返回,将没有空间存储所需的信息,并且您会遇到堆栈溢出异常。由于每次用户输入无效值时,您都会再次调用该函数,因此您可能会得到该异常

标签: java recursion area


【解决方案1】:

getLength()中,你递归调用了getLength(),但是你没有使用结果,也就是说return length仍然返回0

getLength();替换为

length = getLength();

(宽度相同)

【讨论】:

    【解决方案2】:

    当您的getLength() 方法调用自身时,它会丢弃返回值。尝试将递归调用更改为:

    ...
    System.out.println("Input must be a double.");
    length = getLength();
    ...
    

    getWidth() 也是如此。

    【讨论】:

      【解决方案3】:

      不要忘记将新方法分配给调用它的第一个函数:

      package recursiontest;
      
      import java.util.Scanner;
      
      public class RecursionTest 
      {
      
      static void main(String[] args) {
          // TODO code application logic here
          double length = getLength();
          double width = getWidth();
          double area = getDimensions(length, width);
          displayArea(area);
      }
      
      public static double getLength(){
          double length = 0;
          Scanner in = new Scanner(System.in);
          System.out.print("Please enter the rectangle's length: ");
          if(in.hasNextDouble()){
              length = in.nextDouble();
          }
          else{
              System.out.println("Input must be a double.");
              length = getLength();
          }
          return length;
      }
      
      public static double getWidth(){
          double width = 0;
          Scanner in = new Scanner(System.in);
          System.out.print("Please enter the rectangle's width: ");
          if(in.hasNextDouble()){
              width = in.nextDouble();
          }
          else{
              System.out.println("Input must be a double.");
              width = getWidth();
          }
          return width;
      }
      
      public static double getDimensions(double length, double width){
          double area = 0;
          area = length * width;
          return area;
      }
      
      public static void displayArea(double area){
          System.out.println("Area = "+area);
       }
      

      }

      【讨论】:

        猜你喜欢
        • 2016-02-05
        • 2019-09-12
        • 1970-01-01
        • 2012-09-19
        • 2010-10-30
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        相关资源
        最近更新 更多