再帰的に実行できますが、関数間で多くの状態情報をやり取りする必要があります。この問題が単純なループで解決できる場合、これは価値がないと思います。
他の人が言うように、2 つの「望ましい結果」文字列が考えられます。1 つは大文字で始まり (result_U と呼びましょう)、もう 1 つは小文字で始まります (result_L)。EditDistance(input, result_U) と EditDistance(input, result_L) の小さい方が必要です。
また、EditDistance(input, result_U) を計算するために、result_U を生成する必要はなく、入力を一度に 1 文字ずつスキャンするだけでよいことに注意してください。想定されたケースではない各文字は、それをつまり、編集距離に 1 を追加します。EditDistance(input, result_L) についても同様です。
また、2 つのループを組み合わせて、入力を 1 回だけスキャンすることもできます。実際、これは各入力文字列の読み取り中に実行できます。単純なアプローチは次のようになります。
擬似コード:
EditDistance_U = 0
EditDistance_L = 0
Read a character
To arrive at result_U, does this character need editing?
Yes => EditDistance_U += 1
No => Do nothing
To arrive at result_L, does this character need editing?
Yes => EditDistance_L += 1
No => Do nothing
Loop until end of string
EditDistance = min(EditDistance_U, EditDistance_L)
上記にも実行できる明らかな最適化がありますが、それはあなたに任せます。
ヒント 1: ループに 2 つの条件が必要ですか? それらは互いにどのように関連していますか?
ヒント 2: EditDistance_U + EditDistance_L とは?