위키피디아에서는 Reverse().Aggregate(initval, func)
이 오른쪽 접지라고 말합니다. 이것은 사실이 아니지만 오히려 싸구려 경찰관처럼 들리지만 ... 누구든지이 문제에 대해 의견을 말할 수 있습니까? C#에 올바른 폴드가 있습니까?C# Enumerable.Reverse(). Aggregate (initval, func) True를 true로 설정 했습니까?
2
A
답변
0
오른쪽 접기를 정의하고 Reverse().Aggregate(initval, func)
이 들어 맞는지 확인하십시오.
정의 : 나머지를 결합의 결과에 첫 번째 요소를 결합은
권리 배 그래서 당신은
(1, 2, 3)
의 합을 CALC하려면
이라고합니다. Aggregate
의 경우 평가는 (1 + 2) + 3
이됩니다. Reverse().Aggregate
인 경우 정의에 가장 적합한 (3 + 2) + 1
이됩니다.
Reverse
은 값 비싼 조작이기 때문에 질문하는 것이 효율적 일지 모르지만 기능적으로는 오른쪽 배가 완벽합니다.
0
Aggregate
은 왼쪽에서 오른쪽입니다. 역방향 목록을 집계하는 것은 모든 역방향 목록에서 완전한 (비 게으름) 오른쪽 접기와 동일한 의미를가집니다.
오른쪽 폴드가 '1 + (2 + 3)'이 아니어야합니까? –
@Andrey : 효율성에 대해 좀 더 자세히 설명해 주시겠습니까? 오른쪽 배를보다 효율적으로 구현하는 것이 어떻게 가능합니까? 나는 그것에 대해 많이 생각하고 있었고 단지 재귀를 사용하는 해결책을 생각해 냈습니다 (큰 순서에 스택 오버 플로우가 발생할 수 있음). –
@tomp'List' 나 다른 데이터 구조를 가지고 있으면 순방향에서 순방향으로 순회 할 수 있습니다. 가장 저렴한 옵션은 꼬리에서 끝까지 반복하는 것입니다. 어쨌든 당신은 1) 순수한 2) 연관 3) 교환 가능한 연산자/기능을 가지고 있다면 오른쪽 꺾는 데 어떤 포인트가 표시되지 않습니다. 'a + (b + c) == (a + b) + c' 그래서 아주 이국적인 경우가 아니면 접히지 않고 오른쪽 접기를 할 필요가 없습니다. – Andrey