编写一个递归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;
}
我如何通过递归来做到这一点?
答案 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
作为输入。