如何控制递归方法的流程?

时间:2015-11-09 09:37:41

标签: java recursion combinations

我在纠正这个算法的流程时遇到了困难。

对于String h = "##",此算法给出了正确的输出:

ReemReem
ReemRawan
RawanReem
RawanRawan

String h = "00" 该算法给出了正确的输出:

00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.
.
.
98
99

String h = "#0" 该算法给出了正确的输出:

Reem0
Reem1
Reem2
Reem3
Reem4
Reem5
Reem6
Reem7
Reem8
Reem9
Rawan0
Rawan1
Rawan2
Rawan3
Rawan4
Rawan5
Rawan6
Rawan7
Rawan8
Rawan9

String h ="##0" 这个算法给了我一个错误的输出,它是:> ReemReem0

ReemReem1
ReemReem2
ReemReem3
ReemReem4
ReemReem5
ReemReem6
ReemReem7
ReemReem8
ReemReem9
ReemRawanReem
ReemRawanRawan
RawanReem0
RawanReem1
RawanReem2
RawanReem3
RawanReem4
RawanReem5
RawanReem6
RawanReem7
RawanReem8
RawanReem9
RawanRawanReem
RawanRawanRawan

以及string h ="#0#"这个算法给出了错误的输出:

Reem0Reem
Reem0Rawan
Reem10
Reem11
Reem12
Reem13
Reem14
Reem15
Reem16
Reem17
Reem18
Reem19
Reem20
Reem21
Reem22
Reem23
Reem24
Reem25
Reem26
Reem27
Reem28
Reem29
Reem30
Reem31
Reem32
Reem33
Reem34
Reem35
Reem36
Reem37
Reem38
Reem39
Reem40
Reem41
Reem42
Reem43
Reem44
Reem45
Reem46
Reem47
Reem48
Reem49
Reem50
Reem51
Reem52
Reem53
Reem54
Reem55
Reem56
Reem57
Reem58
Reem59
Reem60
Reem61
Reem62
Reem63
Reem64
Reem65
Reem66
Reem67
Reem68
Reem69
Reem70
Reem71
Reem72
Reem73
Reem74
Reem75
Reem76
Reem77
Reem78
Reem79
Reem80
Reem81
Reem82
Reem83
Reem84
Reem85
Reem86
Reem87
Reem88
Reem89
Reem90
Reem91
Reem92
Reem93
Reem94
Reem95
Reem96
Reem97
Reem98
Reem99
Rawan0Reem
Rawan0Rawan
Rawan10
Rawan11
Rawan12
Rawan13
Rawan14
Rawan15
Rawan16
Rawan17
Rawan18
Rawan19
Rawan20
Rawan21
Rawan22
Rawan23
Rawan24
Rawan25
Rawan26
Rawan27
Rawan28
Rawan29
Rawan30
Rawan31
Rawan32
Rawan33
Rawan34
Rawan35
Rawan36
Rawan37
Rawan38
Rawan39
Rawan40
Rawan41
Rawan42
Rawan43
Rawan44
Rawan45
Rawan46
Rawan47
Rawan48
Rawan49
Rawan50
Rawan51
Rawan52
Rawan53
Rawan54
Rawan55
Rawan56
Rawan57
Rawan58
Rawan59
Rawan60
Rawan61
Rawan62
Rawan63
Rawan64
Rawan65
Rawan66
Rawan67
Rawan68
Rawan69
Rawan70
Rawan71
Rawan72
Rawan73
Rawan74
Rawan75
Rawan76
Rawan77
Rawan78
Rawan79
Rawan80
Rawan81
Rawan82
Rawan83
Rawan84
Rawan85
Rawan86
Rawan87
Rawan88
Rawan89
Rawan90
Rawan91
Rawan92
Rawan93
Rawan94
Rawan95
Rawan96
Rawan97
Rawan98
Rawan99

这是我的算法:

package finalprogram;

public class FinalProgram {

    static String[] chars = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    static String[] names = {"Reem", "Rawan"};
    static int i = 0;
    static boolean flag = true;
    static String h = "";

    static void GenerateAllPasswordsWords(String pwd, int pos, int siz) {

        if (pos < siz) {

            if (h.charAt(i) == '#') {
                //System.out.println("from if rule=#");
                //System.out.println("i= " + i);
                for (String ch1 : names) {
                    i++;
                    GenerateAllPasswordsWords(pwd + ch1, pos + 1, siz);
                }
            }
            if (h.charAt(i) == '0') {
                // System.out.println("from else rule=0");
                // System.out.println("i= " + i);

                for (String ch : chars) {
                    i++;
                    GenerateAllPasswordsWords(pwd + ch, pos + 1, siz);

                }

            }

        } else {
            System.out.println(pwd);
        }
        i = 0;
    }

    public static void main(String[] args) {
        h = "#0#";
        GenerateAllPasswordsWords("", 0, h.length());
    }

}

我知道问题是在for循环中增加变量i,但我不知道如何纠正它。

3 个答案:

答案 0 :(得分:2)

共享可变状态和递归是一个非常糟糕的匹配 使用递归函数,您几乎总是希望在函数的参数中保持计算的状态并返回值 (在非递归函数中也是一个好主意。)

您甚至不需要i,您应该使用参数pos 并且size参数是不必要的,因为您知道输入的长度。

自包含版本可能如下所示:

static void GenerateAllPasswordsWords(String input, int pos, String pwd) {
    if (pos < input.length()) {
        if (input.charAt(pos) == '#') {
            for (String ch1 : names) {
                GenerateAllPasswordsWords(input, pos + 1, pwd + ch1);
            } 
        }
        else if (input.charAt(pos) == '0') {
            for (String ch : chars) {
                GenerateAllPasswordsWords(input, pos + 1, pwd + ch);

            }
        }
    } else {
        System.out.println(pwd);
    }
}

static void GenerateAllPasswords(String input)
{
    GenerateAllPasswordsWords(input, 0, "");
}

答案 1 :(得分:1)

创建所有内容的代码方法应该类似于以下内容

您使用i有两个目的,即迭代和变量h的位置。您已经拥有变量pos,请使用它。

你现在也不需要i,因为它从未使用过,从一开始就没有任何意义。

static void GenerateAllPasswordsWords(String pwd, int pos, int siz) {

    if (pos < siz) {
        if (h.charAt(pos) == '#') { // Dont use i here, you have pos as your current position parameter
            for (String str : names) {
                GenerateAllPasswordsWords(pwd + str, pos + 1, siz);
            }
        }
        if (h.charAt(pos) == '0') {
            for (String str : chars) { // Why do you use i
                GenerateAllPasswordsWords(pwd + str, pos + 1, siz);
            }
        }

    } else {
        System.out.println(pwd);
    }
}

答案 2 :(得分:0)

这是校正后的算法

公共类FinalProgram {

static String[] chars = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
static String[] names = {"Reem", "Rawan"};
static String h = "";

static void GenerateAllPasswordsWords(String pwd, int pos, int siz) {

    if (pos < siz) {

        if (h.charAt(pos) == '#') {
            for (String ch1 : names) {

                GenerateAllPasswordsWords(pwd + ch1, pos + 1, siz);
            }
        }
        if (h.charAt(pos) == '0') {

            for (String ch : chars) {

                GenerateAllPasswordsWords(pwd + ch, pos + 1, siz);

            }

        }

    } else {
        System.out.println(pwd);
    }
}

public static void main(String[] args) {
    h = "0##0";
    GenerateAllPasswordsWords("", 0, h.length());
}

}