В псевдокоде (ну, на самом деле, на Python, но он настолько близок к псевдокоду, насколько это возможно в реальном языке):
def recurse (pref,suff):
# If no characters left, just print prefix.
if suff == "":
print pref
return
# Otherwise add lowercase of first suffix letter to prefix
# and recur with that and the remainder of the suffix.
# Then do the same for uppercase.
# If you wanted smarts, this is where you'd detect if the
# upper and lower were the same and only recurse once.
recurse (pref + suff[0:1].lower(), suff[1:])
recurse (pref + suff[0:1].upper(), suff[1:])
# Test the function with "Ben".
recurse ("","beN")
Это выводит:
ben
beN
bEn
bEN
Ben
BeN
BEn
BEN
Как это работает, относительно просто (большинство рекурсивных решений - это когда вы их понимаете).
Начальное условие - когда у вас нет префикса и суффикса, который вам нужно перебрать, чтобы получить все различные возможности смешанного регистра.
Условие завершения - просто, когда не осталось букв для выбора двух вариантов.
Каждое другое условие вы просто повторяете дважды, один раз с буквой в нижнем регистре и один раз с верхним.
Имейте в виду, что это не будет правильно обрабатывать не-буквенные символы, это только для того, чтобы показать вам, как работает логика. Например, для строки «a!» Вы получите четыре строки вывода, хотя «!» одинаково в верхнем и нижнем регистре.
Для правильной обработки этого вы должны использовать:
def recurse (pref,suff):
# If no characters left, just print prefix.
if suff == "":
print pref
return
# Otherwise add lowercase of first suffix letter to prefix
# and recur with that and the remainder of the suffix.
# Then do the same for uppercase.
# We also detect if the upper and lower are the same
# and only recurse once.
if suff[0:1].lower() == suff[0:1].upper():
recurse (pref + suff[0:1], suff[1:])
else:
recurse (pref + suff[0:1].lower(), suff[1:])
recurse (pref + suff[0:1].upper(), suff[1:])
# Test the function with "Ben!!!".
recurse ("","beN!!!")
, который дает только 8 строк вместо 64.
Эквивалент в Java, поскольку это не домашняя работа, это:
public class test {
public static void recurse (String pref, String suff) {
if (suff.length() == 0) {
System.out.println (pref);
return;
}
String first = suff.substring(0,1);
String rest = suff.substring(1);
if (first.toLowerCase().equals(first.toUpperCase())) {
recurse (pref + first, rest);
} else {
recurse (pref + first.toLowerCase(), rest);
recurse (pref + first.toUpperCase(), rest);
}
}
public static void main(String[] args) {
recurse ("","beN!!!");
}
}