Вам нравятся рекурсии :-).Как насчет этой пары функций:
public boolean check(int num)
{
// This is actually unnecessary as check is called only for even numbers
if ((num % 2) != 0)
return false;
int prev_digit = 10;
while (num > 0) {
int last_digit = num % 10;
if (last_digit >= prev_digit)
return false;
prev_digit = last_digit;
num = num / 10;
}
return true;
}
public String orderAndPrint(int decimal)
{
String outstr = ""
int last_num = Math.pow(10, decimal);
int num = 2;
for ( ; num < last_num; num += 2) {
if (check(num))
outstr = outstr + num + " ";
}
return outstr + "End";
}
Но этот фрагмент кода просто копирует то, что вы сделали более эффективно, без рекурсии.
Однако вы можете написать код, чтобы просто сгенерировать соответствующие числа, и там вам действительно нужна рекурсия.Обратите внимание, что наибольшее возможное такое число - 12345678, поэтому максимальное количество цифр - 8, и все такие числа помещаются в int.Кроме того, ни одна из цифр не будет больше 8, и только последняя может быть 8.
public String addnumbers (int n, int digitsleft, String outstr)
{
int d;
int last_digit = n % 10;
if (digitsleft == 1) {
d = (last_digit+1) % 2 == 0 ? last_digit+1 : last_digit+2;
for ( ; d <= 8; d += 2) {
outstr = outstr + (10*n+d) + " ";
}
}
else {
for (d=last_digit+1; d < 8; ++d) {
outstr = addnumbers(10*n+d, digitsleft-1, outstr);
}
}
return outstr;
}
public String orderAndPrint(int decimal)
{
// Assume decimal is at least 1
String outstr = "2 4 6 8 "
int d;
decimal = Math.min(8, decimal);
for (d = 1; d < 8; ++d) {
outstr = addnumbers(d, decimal-1, outstr);
}
return outstr + "End";
}
Обратите внимание, что это может быть ускорено путем использования лучшей верхней границы d в циклах.Например, если после текущей есть еще 2 цифры, то d не может быть больше 6. Но это просто запутало бы код.