首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归函数返回

递归函数返回
EN

Stack Overflow用户
提问于 2017-04-25 00:36:40
回答 3查看 95关注 0票数 1
代码语言:javascript
复制
int gcd(int a,int b){   
    if(b==0)
      return a;
    else if(a<b)
        gcd(b,a);
    else
        gcd(b,a%b);
}

在这个递归函数中有一个错误,它说:

代码语言:javascript
复制
control reaches end of non-void function [-Werror=return-type]

为什么会这样呢?

EN

回答 3

Stack Overflow用户

发布于 2017-04-25 00:44:47

您没有对gcd()的递归调用的返回值做任何操作。从函数返回任何东西的唯一地方是if b == 0。B的任何其他值都将导致gcd()被递归调用,但随后执行将在函数结束时立即运行,不返回任何内容。将你对gcd()的调用改为return gcd( b, a );return gcd( b, a % b );,你就会变得很好。

票数 0
EN

Stack Overflow用户

发布于 2017-04-25 01:16:31

必须使用return返回值。您可以使用一条return语句和一个涉及第三运算符的表达式来代替if else。然后,您可能还希望将此函数设置为constexpr函数

代码语言:javascript
复制
inline constexpr int gcd(int a, int b) noexcept
{
  return b==0? a: a<b? gcd(b,a) : gcd(b,a%b);
}

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

票数 0
EN

Stack Overflow用户

发布于 2017-04-25 06:27:10

为什么会这样?

你的代码有3个路径和1个'return‘。问问自己,‘如果这两个递归gcd()调用的计算被丢弃/忽略/丢弃,为什么还要这样做?’

你的代码就像你写的一样:

代码语言:javascript
复制
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条返回语句:

代码语言:javascript
复制
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)); }
}

它是“更好的”。

也许我喜欢的风格(不是那么‘结构化’,只有一次返回,但循环中有多个中断)进一步简化了这个问题?

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43593487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档