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]为什么会这样呢?
发布于 2017-04-25 00:44:47
您没有对gcd()的递归调用的返回值做任何操作。从函数返回任何东西的唯一地方是if b == 0。B的任何其他值都将导致gcd()被递归调用,但随后执行将在函数结束时立即运行,不返回任何内容。将你对gcd()的调用改为return gcd( b, a );和return gcd( b, a % b );,你就会变得很好。
发布于 2017-04-25 01:16:31
必须使用return返回值。您可以使用一条return语句和一个涉及第三运算符的表达式来代替if else。然后,您可能还希望将此函数设置为constexpr函数
inline constexpr int gcd(int a, int b) noexcept
{
return b==0? a: a<b? gcd(b,a) : gcd(b,a%b);
}允许涉及gcd()的编译时操作。
发布于 2017-04-25 06:27:10
为什么会这样?
你的代码有3个路径和1个'return‘。问问自己,‘如果这两个递归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条返回语句:
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
}我已经习惯了这一点,但仍然拒绝多次返回。
https://stackoverflow.com/questions/43593487
复制相似问题