2010-12-08 3 views

답변

0

오른쪽 접기를 정의하고 Reverse().Aggregate(initval, func)이 들어 맞는지 확인하십시오.

정의 : 나머지를 결합의 결과에 첫 번째 요소를 결합은

권리 배 그래서 당신은 (1, 2, 3)의 합을 CALC하려면

이라고합니다. Aggregate의 경우 평가는 (1 + 2) + 3이됩니다. Reverse().Aggregate 인 경우 정의에 가장 적합한 (3 + 2) + 1이됩니다.

Reverse은 값 비싼 조작이기 때문에 질문하는 것이 효율적 일지 모르지만 기능적으로는 오른쪽 배가 완벽합니다.

+1

오른쪽 폴드가 '1 + (2 + 3)'이 아니어야합니까? –

+0

@Andrey : 효율성에 대해 좀 더 자세히 설명해 주시겠습니까? 오른쪽 배를보다 효율적으로 구현하는 것이 어떻게 가능합니까? 나는 그것에 대해 많이 생각하고 있었고 단지 재귀를 사용하는 해결책을 생각해 냈습니다 (큰 순서에 스택 오버 플로우가 발생할 수 있음). –

+0

@tomp'List' 나 다른 데이터 구조를 가지고 있으면 순방향에서 순방향으로 순회 할 수 있습니다. 가장 저렴한 옵션은 꼬리에서 끝까지 반복하는 것입니다. 어쨌든 당신은 1) 순수한 2) 연관 3) 교환 가능한 연산자/기능을 가지고 있다면 오른쪽 꺾는 데 어떤 포인트가 표시되지 않습니다. 'a + (b + c) == (a + b) + c' 그래서 아주 이국적인 경우가 아니면 접히지 않고 오른쪽 접기를 할 필요가 없습니다. – Andrey

0

Aggregate은 왼쪽에서 오른쪽입니다. 역방향 목록을 집계하는 것은 모든 역방향 목록에서 완전한 (비 게으름) 오른쪽 접기와 동일한 의미를가집니다.

관련 문제