Решение Свика в порядке, но я подумал, что добавлю немного более общих советов.Похоже, вы новичок в написании рекурсивных методов и немного боролись там.Самый простой способ написать рекурсивный метод - строго следовать шаблону:
Result M(Problem prob)
{
if (<problem can be solved easily>)
return <easy solution>;
// The problem cannot be solved easily.
Problem smaller1 = <reduce problem to smaller problem>
Result result1 = M(smaller1);
Problem smaller2 = <reduce problem to smaller problem>
Result result2 = M(smaller2);
...
Result finalResult = <combine all results of smaller problem to solve large problem>
return finalResult;
}
Итак, предположим, вы хотите решить проблему «какова максимальная глубина моего двоичного дерева?»
int Depth(Tree tree)
{
// Start with the trivial case. Is the tree empty?
if (tree.IsEmpty) return 0;
// The tree is not empty.
// Reduce the problem to two smaller problems and solve them:
int depthLeft = Depth(tree.Left);
int depthRight = Depth(tree.Right);
// Now combine the two solutions to solve the larger problem.
return Math.Max(depthLeft, depthRight) + 1;
}
Вам нужно три вещи, чтобы заставить рекурсию работать:
- Проблема должна уменьшаться на каждый раз, когда вы выполняете рекурсию.
- В конечном итоге проблема должна стать настолько малой, что ее можно будет решить без рекурсии
- Проблема должна быть решена путем разбивки ее на ряд более мелких задач, решения каждой из них и объединения результатов.
Если вы не можете гарантировать эти три вещи, тогда не используйте рекурсивное решение .