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

问题描述:

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

很容易做到不递归:

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; 

} 

我如何做,与递归?

+5

你试过了什么?它在哪里失败? – DimChtz

+0

你的意思是数字? – StoryTeller

+0

为什么递归甚至是必要的? – iBug

下面是什么情况?

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

如果发现没有工作,甚至数字如下,假设初始数量不0它返回11。 您可以轻松修复它,以便在发生故障时将-1返回,并将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); 
    }