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()
递归调用的返回值没有做任何处理。从函数返回任何内容的唯一位置是if
b==0
。b的任何其他值都将导致递归调用
gcd()
,但执行将直接在函数末尾运行,不返回任何结果。
将调用
gcd()
更改为
返回gcd(b,a)
返回gcd(b,a%b)
你会很好的。

gcd()
递归调用的返回值没有做任何处理。从函数返回任何内容的唯一位置是if
b==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
}