注意,在你的問題,在每個遞歸步驟,你通過這兩個字符串中的一個尺寸減小,直到其中一方具有零長度(的基本情況遞歸)。很容易看出,遞歸調用的數量爲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
非常感謝。這個答案正是我所問的。通過將方法分解爲簡單的術語,我現在可以看到爲什麼每個呼叫都會發生,以及何時達到基本情況以結束呼叫。再次感謝你。 – user1362246 2012-04-28 16:05:19
@ user1362246不客氣:) – 2012-04-28 16:09:00