質問では、再帰的な各ステップで、両方の文字列のいずれかが長さゼロになるまで、両方の文字列のサイズを1つ減らします(再帰の基本ケース)。再帰呼び出しの数がであることが簡単にわかりますmin(m, n) + 1
。ここm
で、はの初期の長さでs1
ありn
、はの初期の長さですs2
。
たとえば、s1 = "abc"
トラバースs2 = "de"
するために2回の再帰呼び出しs2
(最小長の文字列)に加えて、ベースケースで終了するための1回の追加呼び出しが必要な場合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