Short answer: in general you can, in this case you can easily, but if you fix the bug in your code's logic you have to worry about maintaining a stack yourself.
Long answer:
First, the iterative version of your recursive method:
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;
}
}
}
This works by replacing the recursive call with assignment to the parameters, and sticking it all in a loop.
But like your original code, this contains a bug!
(I can't think of actual words that this bug works with, so imagine my made up words are real words.)
Suppose your long word is ABCDEFGH, and that ABCD, EFGH, and ABCDE are all words, but FGH isn't. recur looks for the longest word first, so it will match ABCDE, then discover that FGH isn't a word, and tell you that ABCDEFGH can't be cut into subwords.
But it could be split into ABCD and EFGH! It misses the shorter initial match because you don't consider other options once you've found a match. (And if your code started by looking for the shorter match, it still wouldn't work if ABC was a word and DEFGH wasn't.)
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);
}
Now, turning this into an iterative method is harder: sometimes you have two recursive calls. That means simply assigning to your parameters won't work, because you need the parameters' original values to calculate the parameters for the second call. You have to explicitly manage a stack or a queue with all the different values, because now the language isn't doing it for you.