Variable Number of Nested For Loops

后端 未结 3 2091
盖世英雄少女心
盖世英雄少女心 2021-02-08 12:03

I\'m making a word unscrambler in java. Right now I have a program that can print all rearrangements of 3 letters chosen from a word with 3 or more letters (no repeats). So for

3条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-08 12:43

    With the recursive method you would put one of your looping in a function pass the loop parameters to that function. Then from within the function's loop, it calls its to nest another loop.

    void loopFunction(ArrayList> newWords, int level) {
        if (level == 0) { // terminating condition
            if (/* compare the indices by for example passing down a list with them in  */)
            {
                newWords.get(...).add(...);
            }
        } else {// inductive condition
            for (int i = 0; i < len; i++) {
                loopFunction(newWords, level-1);
            }
        }
    }
    

    So for your example you need 3 levels of recursion so you would start the recursion with:

    loopFunction(newWords, 3);
    

    Edit

    Since you have been having trouble here is a working version. It keeps a list of indices to compare against and it builds up the string as it goes. The rearranged words are added to the 2D array at each level to get all lengths of words. With recursion it is easiest to think functionally and not change and keep the variables immutable (unchangeable). This code mostly does that although I update the indices rather than create a new copy for convenience.

    void loopFunction(ArrayList lets, ArrayList> newWords, int level, ArrayList indices, String word) {
        if (level == 0) { // terminating condition
            return;
        } else { // inductive condition
            for (int i = 0; i < lets.size(); i++) {
                if (!indices.contains(i)) { // Make sure no index is equal
                    int nextLevel = level-1;
                    String nextWord = word+lets.get(i);
    
                    newWords.get(level-1).add(nextWord);
    
                    indices.add(i);
                    loopFunction(lets, newWords, nextLevel, indices, nextWord);
                    indices.remove((Integer) i);
                }
            }
        }
    }
    

提交回复
热议问题