n-ary Tree 데이터 구조를 폴드하고 싶습니다.
내가 일하는 해결책을 마련하기 위해 관리 (배는 집계는 Linq에에 일명입니다) :C에서 n-ary 트리를 접는 방법
public static R Aggregate<T, R>(T node,
Func<T, IEnumerable<T>> getChildren,
Func<T, IEnumerable<R>, R> aggregator)
{
var childResults = getChildren(node)
.Select(c => Aggregate(c, getChildren, aggregator));
return aggregator(node, childResults);
}
getChildren
가 주어진 노드의 자식을 얻는 방법을 정의하는 FUNC이다. 잎 노드에 대해 빈 IEnumerable을 반환해야합니다.
aggregator
은 현재 노드와 그 노드의 결과를 사용하여 노드를 처리하는 방법을 정의합니다.
이 솔루션은 작동하는 것 같다하지만 몇 가지 문제가 있습니다
알고리즘 재귀되고, 그것은 깊은 나무의 스택을 날려 버리겠다.
스택 오버플로를 방지하기 위해 함수를 다시 작성할 수 있습니까?알고리즘은 게으르지 만 일종의 알고리즘입니다.
예 :aggregator
이 자식 노드의 결과 만Enumerable.First
을 사용하는 경우 트리의 가장 왼쪽 분기 만 통과합니다. 그러나Enumerable.Last
을 사용하면 계산에 가장 오른쪽 분기 만 필요한 경우에도 전체 트리가 통과됩니다.
알고리즘을 실제로 게으르게 만들 수 있습니까?
F # 솔루션 환영하지만 C#을 선호합니다. 당신은 스택을 저장하려면 먼저 폭 대신에 깊이 제 1 스위치의, 나무를 통과, 또는 당신의 정확한 요구 사항 일부 트리 탐색 기법 적절한 때
, 당신은 깊은 스택을하지 않았다? 그렇다면 왜이 알고리즘은 트리를 만들 때 이미 스택을 깊이 쌓았을 때 스택을 날려 버릴까요? – philologon
@philologon : 전체 트리는 한번에 메모리에있을 필요는 없습니다. 예를 들어 네트워크 크롤러가 있습니다. – 3dGrabber
연속체 또는 트램펄린을 사용하십시오. –