C ++递归:返回数字的最小偶数

时间:2017-08-07 12:37:04

标签: c++ recursion

编写一个递归C ++函数,该函数返回作为参数传输的自然数的最小偶数。 如果数字不包含任何偶数,则返回-1。

没有递归就容易做到:

int cifminpar(int x)
{
    int mi = 9;
   while(x)
   {
       if(x % 10 % 2 == 0)
        mi = min(mi , x%10 );
       x /= 10;

   }
   if(mi == 9)
        return -1;
   else return mi;

}

我如何通过递归来做到这一点?

2 个答案:

答案 0 :(得分:0)

请记住:最小的偶数是“第一个”或“没有第一个数字中最小的数字”。

您可以递归地比较“当前数字”和“之后的最小数字”:

  int cifminpar(int x)
  {
      int ret = cifminpar_recur(x, 10);
      if (ret == 10)
          return -1;
      return ret;
  }

  int cifminpar_recur(int x, int mi)
  {
      if (x == 0)
          return mi;
      if (x % 2 == 1)
          mi = min(mi, x % 10);
      return cifminpar_recur(x / 10, mi);
  }

我们甚至可以删除额外的变量。

  int cifminpar(int x)
  {
      int ret = cifminpar_recur_optimised(x);
      if (ret == 10)
          return -1;
      return ret;
  }

  int cifminpar_recur_optimised(int x)
  {
      if (x == 0)
          return 10;
      if (x % 2 == 1)
          return min(x % 10, cifminpar_recur_optimised(x / 10));
      return cifminpar_recur_optimised(x / 10);
  }

答案 1 :(得分:0)

如下所示:

int cifminpar(const int x)
{
    if(!x)
        return 11;
    //recursive call
    int minrest=cifminpar(x/10); //min even in the rest of the digits
    if(x % 10 % 2 == 0)
        return min(minrest , x%10 );
    return minrest;
}

如果没有找到偶数数字,则返回11并按如下方式工作,并假设初始数字不是0。 您可以轻松修复修改,以便在失败时返回-1,并将0作为输入。