C#で再帰関数内の成功ケースの数を計算しようとしていますが、私の変数がすべての関数呼び出しで共有されていることに驚いています。再帰関数で変数が共有される
[アップデート2]奇妙より
より今回。完全なコード:この
i = validTreesFun(tree.Nodes, newWords.ToList()) + i ;
をやってそう
i = i + validTreesFun(tree.Nodes, newWords.ToList()) ;
リセット私にには0
[更新(私はそれが正しいかどうか分からない)いくつかの結果を提供します]
public static int validTreesFun(List<Tree<char>> nodes, List<string> words)
{
int i = 0;
if (nodes == null && (words == null || words.Count == 0 || (words.Count == 1 && words.First() == "")))
return 1;
else
if (nodes == null)
return 0;
foreach (Tree<char> tree in nodes)
{
var validWords = words.Where(w => w.ToCharArray()[0] == tree.Root)
.Select(w => w);
if (validWords.Count() == 0)
return 0;
else
{
var newWords = validWords.Select(w => join(w.ToCharArray().Skip(1).ToArray()));
i += validTreesFun(tree.Nodes, newWords.ToList());
}
}
return i;
}
変数iをデバッグすると値1が取られますが、次の反復では0にリセットされます!
i = i + ....
コードのその部分での問題は何ですか?の使用にもかかわらず
なしのローカル変数が全く再帰呼び出し間で共有されていないされていない、あなたが他のいくつかの設計上の問題を考慮する必要があり、あなたのforeachループの内側と後に、私はすべてのreturn文を参照してくださいいけないあなたに
のように書くことができ、私はあなたがrecurisveコールを皮肉って、単純なREPROを作成し、すべてのリスト、ツリーとLINQものを取り除くべきだと思います。 cut'n'pastedできる完全なReproを作り出すことができますか? – AnthonyWJones
私は元の(編集)質問を見ましたが、ここでコード全体を尋ねました。私はコードを間違えたかもしれないからです! – 0xFF