Краткий ответ: в общем, вы можете, в этом случае вы можете легко, но если вы исправите ошибку в логике вашего кода, вам придется самим заботиться о поддержании стека.
Длинный ответ:
Во-первых, итерационная версия вашего рекурсивного метода:
private static boolean recur(String word, int length) {
while(true) {
if(length == 1 || length == 2)
return false;
if(length == 0)
return true;
if(words[length].contains(word.substring(0, length))) {
int newlen = word.length() - length;
word = word.substring(length);
length = newlen;
}
else {
--length;
}
}
}
Это работает, заменяя рекурсивный вызов назначением параметров и помещая все это в цикл.
Но, как и ваш оригинальный код, он содержит ошибку!
(Я не могу вспомнить реальные слова, с которыми работает эта ошибка, поэтому представьте, что мои выдуманные слова - настоящие слова.)
Предположим, ваше длинное слово - ABCDEFGH, а ABCD, EFGH и ABCDE - все слова, но FGH - нет. recur
сначала ищет самое длинное слово, поэтому оно будет соответствовать ABCDE, затем обнаружит, что FGH - не слово, и скажет вам, что ABCDEFGH нельзя разрезать на подслово.
Но это можно разделить на ABCD и EFGH! Он пропускает более короткое начальное совпадение, потому что вы не рассматриваете другие варианты, как только нашли совпадение. (И если ваш код начинается с поиска более короткого соответствия, он все равно не сработает, если ABC будет словом, а DEFGH - нет.)
Итак:
private static boolean recur(String word, int length) {
if(length == 1 || length == 2)
return false;
if(length == 0)
return true;
return (words[length].contains(word.substring(0, length)))
&& recur(word.substring(length), word.length() - length))
|| recur(word, length-1);
}
Теперь превратить это в итеративный метод сложнее: иногда у вас есть два рекурсивных вызова. Это означает, что простое назначение параметров не будет работать, потому что вам нужны исходные значения параметров для расчета параметров для второго вызова. Вы должны явно управлять стеком или очередью со всеми различными значениями, потому что теперь язык не делает это за вас.