C++ 递归函数返回
这是为什么?对C++ 递归函数返回,c++,C++,这是为什么?对gcd()递归调用的返回值没有做任何处理。从函数返回任何内容的唯一位置是ifb==0。b的任何其他值都将导致递归调用gcd(),但执行将直接在函数末尾运行,不返回任何结果。 将调用gcd()更改为返回gcd(b,a)和返回gcd(b,a%b)你会很好的。对gcd()递归调用的返回值没有做任何处理。从函数返回任何内容的唯一位置是ifb==0。b的任何其他值都将导致递归调用gcd(),但执行将直接在函数末尾运行,不返回任何结果。 将调用gcd()更改为返回gcd(b,a)和返回gcd(
gcd()
递归调用的返回值没有做任何处理。从函数返回任何内容的唯一位置是ifb==0
。b的任何其他值都将导致递归调用gcd()
,但执行将直接在函数末尾运行,不返回任何结果。
将调用
gcd()
更改为返回gcd(b,a)代码>和返回gcd(b,a%b)
你会很好的。对gcd()
递归调用的返回值没有做任何处理。从函数返回任何内容的唯一位置是ifb==0
。b的任何其他值都将导致递归调用gcd()
,但执行将直接在函数末尾运行,不返回任何结果。
将调用gcd()
更改为返回gcd(b,a)代码>和返回gcd(b,a%b)
你会很好。你必须使用return
返回一个值。您可以使用单个return
语句和涉及第三级运算符的表达式,而不是if-else
。然后,您可能还希望将其作为一个函数
inline constexpr int gcd(int a,int b)无异常
{
return b==0?a:a您必须使用return
来返回值。您可以使用一个return
语句和一个包含第三级运算符的表达式,而不是if else
。然后您可能还希望将其作为一个函数
inline constexpr int gcd(int a,int b)无异常
{
返回b==0?a:a
为什么会这样
您的代码有3个路径和1个“return”。问问自己,“如果2个递归gcd()的计算被丢弃/忽略/丢弃,为什么要调用它们呢?”
您的代码就像您编写的:
inline constexpr int gcd(int a, int b) noexcept
{
return b==0? a: a<b? gcd(b,a) : gcd(b,a%b);
}
intgcd(inta,intb)
{
如果(b==0){返回a;}//ok
否则,如果(a)
为什么会这样
您的代码有3个路径和1个“return”。问问自己,“如果2个递归gcd()的计算被丢弃/忽略/丢弃,为什么要调用它们呢?”
您的代码就像您编写的:
inline constexpr int gcd(int a, int b) noexcept
{
return b==0? a: a<b? gcd(b,a) : gcd(b,a%b);
}
intgcd(inta,intb)
{
如果(b==0){返回a;}//ok
else if(abe)因为只有在b==0
时才返回任何值。递归函数的工作原理与非递归函数完全相同。使用返回gcd(b,a%b)
也返回gcd(b,a)
因为只有在b==0
时才返回任何值。递归函数的工作原理与非递归函数完全相同。使用返回gcd(b,a%b)
也返回gcd(b,a)
一次返回,好的,当然。这主要是观点,但持有有效的位置。但是a do/while(0)有中断?这不是很好的结构化代码。两个快速注释-首先,我的主要问题不是单返回,而是函数的其余结构。第二个-与许多教条立场一样,“单返回”当你努力避免多次返回时,可能会很快导致代码过于复杂。一次返回,好的,当然。这主要是观点,但是一个有效的位置。但是do/while(0)有中断?这不是结构良好的代码。两个快速注释-第一,我的主要问题不是单返回,而是函数的其余结构。第二,与许多教条式的位置一样,“单返回”可能会很快导致代码过于复杂,而您会向后弯曲以避免多次返回。
inline constexpr int gcd(int a, int b) noexcept
{
return b==0? a: a<b? gcd(b,a) : gcd(b,a%b);
}
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
}
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
}