手动计算递归调用

时间:2012-04-28 01:47:11

标签: recursion

新CS学生,参加决赛。我试图弄清楚一般会调用递归方法的次数。添加了代码作为示例。如果我输入abcd和efgh,根据字符串的大小调用多少次?如果n是任何数据大小,则任何递归方法中的#调用都是n(?)。

public static String interweave(String s1, String s2)
{ 
   if (s1.equals("") ) return s2;
   else if (s2.equals("")) return s1;
   else return "" + interweave(s1.substring(0,s1.length()-1), s2.substring(0,s2.length()-1))
       +s1.charAt(s1.length()-1)+s2.charAt(s2.length()-1);
}

2 个答案:

答案 0 :(得分:0)

角色并不仅仅意味着长度。您可以将此转换为数字问题,如下所示:

public static String interweave(int s1, int s2)
{ 
   if (s1 == 0) return s2;
   else if (s2 == 0) return s1;
   else return interweave(s1-1, s2-1)+2;
}

答案 1 :(得分:0)

请注意,在您的问题中,在每个递归步骤中,将两个字符串的大小减1,直到其中一个字符串的长度为零(递归的基本情况)。很容易看出递归调用的数量为min(m, n) + 1,其中ms1的初始长度,ns2的初始长度。

例如,如果s1 = "abc"s2 = "de",将需要2次递归调用遍历s2(具有最小长度的字符串)加上一次额外的调用以退出基本情况,因此min(s1.length(), s2.length()) + 1 == 3。你可以像这样以编程方式测试它:

static int counter;

public static String interweave(String s1, String s2) {
    counter++;
    if (s1.equals(""))
        return s2;
    else if (s2.equals(""))
        return s1;
    else
        return interweave(s1.substring(0, s1.length()-1), s2.substring(0, s2.length()-1))
        + s1.charAt(s1.length()-1)+s2.charAt(s2.length()-1);
}

public static int count(String s1, String s2) {
    counter = 0;
    interweave(s1, s2);
    return counter;
}

现在,当您运行以下语句时,公式按预期工作:

// s1.length() == s2.length()
System.out.println(count("abcde", "fghij"));
> 6

// s1.length() > s2.length()
System.out.println(count("abcde", "fg"));
> 3

// s1.length() < s2.length()
System.out.println(count("ab", "cdefg"));
> 3