2017-09-24 68 views
-1

我正在写一个简单的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; 
} 
+2

如果正常执行意味着它不应该达到最终返回语句,那么您可以并且应该抛出异常。 – Michael

+0

有一个@CheckReturnValue注释,[Google的errorprone](http://errorprone.info/bugpattern/CheckReturnValue)用来确保您使用返回值。 –

+0

@AndyTurner根本不是他要求的 – Michael

回答

1

在else分支,你可能打算使用return gcd(b, a),而不是简单地调用gcd(b, a)并没有使用它的结果。

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

+1

谢谢!由于没有使用递归调用返回的值返回当前调用,所以我犯了一个错误。现在我明白了这个错误,它也起作用。 :) – Aniket

0

您需要在每个nonvoid函数的每个可能结束处使用return语句。这不是你可以避免的。所以,如果你有一个带有return语句的if语句,你还需要在函数的每一端都有一个return语句,因为如果条件没有被满足,你的函数将不被编译器接受,因为来电者期待回报。

虽然有,如果你需要它,可以不返回0,就像你现在在你的函数中一样。通常有两种方式:

  1. 返回NULL(不推荐高)

如果返回null,则是喜欢你什么都不是给调用者返回。在这种情况下,调用者必须知道,如果满足某些条件,该函数可能会返回null。

  • 抛出一个异常
  • 你可以抛出一个异常,如果您函数的一些不需要的情况存在。这是更值得推荐的可能性,因为调用者将不得不承认该函数被调用的状态不好,调用者的代码将不得不包含一些try-catch而不是if(returnedObject == null)

    编辑:

    随着您的意见,我现在已经明白你的困惑是什么,我现在可以看到问题。你想使一个递归调用,但你会与你目前的状态出现的情况是:

    要么你将肉停止状态,然后返回一个铸造为int:

    if (b == 0) 
    

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

    gcd(b,a); 
    

    但你不会在你的函数的第二个结果返回递归调用的结果,因此,你不会有任何回报,因此编译器会显示错误。既然你想返回递归调用的结果,因为我认为,你将不得不改变

    gcd(b,a); 
    

    return gcd(b,a); 
    

    那么你的编译器应该被罚款,因为如果和别的块都提供了一个return语句。

    +0

    甚至不提选项1.这是可怕的做法。使用可选或抛出异常。 – Michael

    +0

    谢谢伊沃!我还没有学习例外。 :) – Aniket

    +0

    不客气!当然,检查它们,因为它们在很多方面都非常重要 –

    0

    首先,你错过的东西,这将解决您的问题,这是returnelse 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; 
    } 
    
    +0

    这些并不是代码的缩减,它们只是表达完全相同的东西的不同方式。他们对OP表达方式没有客观的改进。 – Michael