新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);
}
答案 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
,其中m
是s1
的初始长度,n
是s2
的初始长度。
例如,如果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