int foo(char *p)
{
static int i = 0;
if (*p == '\0') return i;
i++;
return foo(p+1);
}
この関数が汎用ライブラリに配置された場合、何が問題になるでしょうか。問題を回避するためにコードを変更するにはどうすればよいですか? このコードを汎用ライブラリに配置すると、正しい文字列の長さが返されますか?
int foo(char *p)
{
static int i = 0;
if (*p == '\0') return i;
i++;
return foo(p+1);
}
この関数が汎用ライブラリに配置された場合、何が問題になるでしょうか。問題を回避するためにコードを変更するにはどうすればよいですか? このコードを汎用ライブラリに配置すると、正しい文字列の長さが返されますか?
問題の 1 つは、呼び出し間で状態が持続することです。
foo("hello");
foo("world");
i
がリセットされないため、2 番目の呼び出しは正しくない結果を返します。
2 回続けて呼び出すと、i
期待どおりにはなりません。これは、起動時に初期化され、呼び出し間で以前の値が保持されるためです。
さらに、スレッドではうまく機能しません。再帰のアイデアは、各再帰レベルでスペースを半分にするバイナリ検索のように、「検索スペース」が急速に減少する場合に最適です。
再帰を使用して文字列を文字単位で処理することは、一度に 1 文字ずつ検索スペースを減らすだけなので、骨の折れるアイデアです。