2017-04-24 188 views
1
int gcd(int a,int b){ 
    if(b==0) 
     return a; 
    else if(a<b) 
     gcd(b,a); 
    else 
     gcd(b,a%b); 
} 

在这个递归函数一个错误是有它说:递归函数返回

control reaches end of non-void function [-Werror=return-type] 

这是为什么?

+4

因为如果'b == 0'只返回任何值。递归函数与非递归函数非常相似。 – molbdnilo

+4

使用'return gcd(b,a%b)'也'返回gcd(b,a)' – Sniper

回答

0

对于从gcd()递归调用返回值,你没有做任何事情。从函数返回任何东西的唯一地方是b == 0。 b的任何其他值都会导致gcd()以递归方式被调用,但是执行将直接在函数的末尾运行,不返回任何内容。 将gcd()的呼叫更改为return gcd(b, a);return gcd(b, a % b);,您就会很好。

0

您必须使用return来返回值。代替if else,您可以使用一个return声明和一个涉及第三运算符的表达式。然后,您可能还需要使这个constexpr功能

inline constexpr int gcd(int a, int b) noexcept 
{ 
    return b==0? a: a<b? gcd(b,a) : gcd(b,a%b); 
} 

允许涉及gcd()编译时的操作。

0

这是为什么?

你的代码有3个路径,1'返回'。问问自己,'为什么如果他们的计算被丢弃/忽略/丢弃,为什么要进行2次递归gcd()调用?“

你的代码,如果你写道:

int gcd(int a,int b) 
{ 
    if(b==0)  { return a; }   // ok 
    else if(a<b) { (void) gcd(b, a); } // error here 
    else   { (void) gcd(b, (a%b)) } // error here 
} 

此重新写了3道和3 return语句:

int gcd(int a,int b) 
{ 
    if (0 == b) { return a;    } 
    else if(a < b) { return gcd(b, a ); } 
    else   { return gcd(b, (a%b)); } 
} 

这是 '更好'。也许我喜欢的风格(不是那么'结构化',有单一的回报,但在循环中有多个中断)更简化了这个问题吗?

int gcd(int a, int b) 
{ 
    int retVal = a; 

    do { 

     if(b == 0) { /* already done */ break; } 

     if(a < b) { retVal = gcd(b, a ); break; } 

     {   retVal = gcd(b, (a%b)); break; }; 

    } while(0); // single pass 'loop' 

    return (retVal); // single return - gcd() is defined to return an int 
} 

我已经习惯了这一点,仍然抵制多重回报。

+0

单返回,ok,当然。这主要是意见,但有效的立场。但是一个do/while(0)有休息吗?这不是结构良好的代码。 – Donnie

+0

两个快速评论 - 首先,我的主要问题不是单一的返回,而是与函数的其余结构。第二 - 与许多教条立场一样,“单次返回”可能会很快导致代码过分复杂,而向后弯曲以避免多次返回。 – Donnie

+0

唐尼是对的。 –