【问题标题】:C++ Recursion: Return the smallest even digit of a numberC ++递归:返回数字的最小偶数位
【发布时间】:2017-08-07 21:06:44
【问题描述】:

编写一个递归 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;

}

如何使用递归来做到这一点?

【问题讨论】:

  • 你尝试了什么?哪里失败了?
  • 你是说数字?
  • 为什么还需要递归?
  • stackoverflow.com/a/1735557/1766544(同样的事情,找到数字的细微差别)
  • 关于递归的一个想法,你应该牢记在心:把复杂的问题分解成同类的小问题。

标签: c++ recursion


【解决方案1】:

像下面这样的呢?

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 作为输入。

【讨论】:

    【解决方案2】:

    记住:最小的偶数要么是“第一个”,要么是“没有第一个的数字中最小的一个”。

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

      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);
      }
    

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2017-10-18
      • 1970-01-01
      • 2016-02-16
      • 2020-07-04
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      相关资源
      最近更新 更多