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;
}
我如何做,与递归?
答
下面是什么情况?
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);
}
你试过了什么?它在哪里失败? – DimChtz
你的意思是数字? – StoryTeller
为什么递归甚至是必要的? – iBug