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]
这是为什么?
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]
这是为什么?
对于从gcd()
递归调用返回值,你没有做任何事情。从函数返回任何东西的唯一地方是b == 0
。 b的任何其他值都会导致gcd()
以递归方式被调用,但是执行将直接在函数的末尾运行,不返回任何内容。 将gcd()
的呼叫更改为return gcd(b, a);
和return gcd(b, a % b);
,您就会很好。
您必须使用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()
编译时的操作。
这是为什么?
你的代码有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
}
我已经习惯了这一点,仍然抵制多重回报。
因为如果'b == 0'只返回任何值。递归函数与非递归函数非常相似。 – molbdnilo
使用'return gcd(b,a%b)'也'返回gcd(b,a)' – Sniper