如何确保在递归函数中返回一些东西?

时间:2017-09-24 15:54:30

标签: java

我正在编写一个简单的GCD函数,我确信它总会返回一些东西,因为我在if中写了一个return语句。如何确保程序不会以编译错误结束。可以在最后再写一个return语句吗?

private static int gcd(long a, long b){
  if(b==0) 
      return (int)a;
  else{
      a=a%b;
      gcd(b,a);
  }
  //I want to avoid the next statement as I think it is redundant, 
  //but the compiler does not allow me to skip it.
  return 0;
}

3 个答案:

答案 0 :(得分:1)

在else分支上,您可能打算使用return gcd(b, a),而不是简单地调用gcd(b, a)而不使用其结果。

通过这种方式,最后不需要使用return 0,因为所有可能的分支现在都会返回。

答案 1 :(得分:0)

在每个非空函数的每个可能的末尾都需要一个return语句。这不是你可以避免的。因此,如果你有一个带有return语句的if语句,你还需要在函数的每一端都有一个return语句,因为如果不满足条件,编译器就不会接受你的函数。 ,因为调用者希望返回。

但是,如果你需要它,可能不会像你现在在你的功能中那样返回0。通常有两种可能性:

  1. return null(高度推荐)
  2. 如果返回null,就好像你没有向调用者返回任何内容。在这种情况下,调用者必须知道,如果满足某些条件,该函数可能返回null。

    1. 抛出异常
    2. 如果存在函数的某些不需要的条件,则可以抛出异常。这是更推荐的可能性,因为调用者必须确认函数是在错误的状态下调用的,然后调用者的代码必须包含一些try-catch而不是if(returnedObject == null)

      编辑:

      通过你的评论,我现在已经明白了你的困惑,我现在可以看到问题。您想要进行递归调用,但当前状态会发生什么:

      要么你将停止条件,然后返回一个转换为int:

      if (b == 0)
      

      或者你会来到else块并进行递归调用:

      gcd(b,a);
      

      但是你不会返回递归调用的结果,因此在函数的第二个结果中你将没有返回,因此编译器会显示错误。由于您想要返回递归调用的结果,我假设您必须更改

      gcd(b,a);
      

      return gcd(b,a);
      

      然后你的编译器应该没问题,因为if和else块都提供了一个return语句。

答案 2 :(得分:0)

首先,您错过了一些可以解决您问题的内容,它return else gcd

中的值private static int gcd(long a, long b) { if (b == 0) return (int) a; else { a = a % b; return gcd(b, a); } }
else

你也可以像这样移除return部分(因为private static int gcd(long a, long b) { if (b == 0) return (int) a; a = a % b; return gcd(b, a); } // - - - - - - - - - - OR - - - - - - - - - - - - - - - private static int gcd(long a, long b) { if (b != 0){ a = a % b; return gcd(b, a); } return (int) a; }

'App' => [
    'namespace' => 'App',
    'encoding' => env('APP_ENCODING', 'UTF-8'),
    'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
    .....
],