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

C++ Recursion: Return the smallest even digit of a number

本文关键字:数字 递归 返回 C++      更新时间:2023-10-16

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

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

下面这样的东西呢?

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

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

您可以递归比较"当前数字"和"它之后的最小数字":

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