Краткий ответ: в целом можно, в данном случае можно легко, но если вы исправите ошибку в логике своего кода, вам придется беспокоиться о поддержке стека самостоятельно.
Длинный ответ:
Во-первых, итеративная версия вашего рекурсивного метода:
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 — нет.)
So:
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);
}
Теперь превратить это в итеративный метод сложнее: иногда у вас есть два рекурсивных вызова. Это означает, что простое присвоение вашим параметрам не сработает, потому что вам нужны исходные значения параметров для расчета параметров для второго вызова. Вы должны явно управлять стеком или очередью со всеми различными значениями, потому что теперь язык не делает это за вас.
person
dave4420
schedule
10.02.2011