-4
int foo(char *p)
{
static int i = 0; 
if (*p == '\0') return i;
i++;
return foo(p+1);
}

この関数が汎用ライブラリに配置された場合、何が問題になるでしょうか。問題を回避するためにコードを変更するにはどうすればよいですか? このコードを汎用ライブラリに配置すると、正しい文字列の長さが返されますか?

4

2 に答える 2

2

問題の 1 つは、呼び出し間で状態が持続することです。

foo("hello");
foo("world");

iがリセットされないため、2 番目の呼び出しは正しくない結果を返します。

于 2013-02-27T12:47:44.667 に答える
2

2 回続けて呼び出すと、i期待どおりにはなりません。これは、起動時に初期化され、呼び出し間で以前の値が保持されるためです。

さらに、スレッドではうまく機能しません。再帰のアイデアは、各再帰レベルでスペースを半分にするバイナリ検索のように、「検索スペース」が急速に減少する場合に最適です。

再帰を使用して文字列を文字単位で処理することは、一度に 1 文字ずつ検索スペースを減らすだけなので、骨の折れるアイデアです。

于 2013-02-27T12:48:24.620 に答える