F #의 함수를 사용하여 연결된 목록의 요소 합계를 어떻게 찾을 수 있습니까?링크 된 목록의 합 찾기 F #
답변
let rec sum a =
match a with
|Nil -> 0
|Link(s,t) -> s+(sum (!t))
예제를 시도했지만 작동하지 않아 문제가 해결되었습니다.
type lists = Nil | Link of (int * (lists ref))
let list1 = Link(3, ref (Link (2, ref Nil)))
let list2 = Link(6, ref (Link (4, ref Nil)))
let list3 = Link(9, ref (Link (6, ref Nil)))
let rec sum = function // or let rec sum list = match list with
| Nil -> 0
| Link(head, tail) -> head + sum !tail
당신은 당신이 그것을 할 경우, 당신은 (일반) 내장 된 '링크리스트'를 가지고 입력 Integer
재미있다. 나는 이것을 시도 할 때 'h'와 'sum! t'유형이 서로 일치하지 않는다고 말한다. –
그것은 나를 위해 일한다. 확실합니까? 처음부터 코드를 시험해보고, 방금 변수의 이름을 변경했습니다. – Gustavo
아 나는 선언 할 때 잘못 입력했다. 유형 rNumber = 정수의 정수 ;; 유형 목록 = 없음 | 링크 (rNumber * (목록 ref)) ;; Integer가 아닌 "rNumber"가 될 수 있습니다. 그래서 'int'가 'rNumber'와 일치하지 않는다는 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있을까요? 지금까지 도와 줘서 고마워! –
F 번호로 모든 숫자에 태그를해야합니다, Integer of int
를 정의 할 필요가 없습니다 - 그 단지 list
라고, 그것은 이미 계산하는 기능을 가지고있는 sum :
let list1 = [2; 3; 5]
List.sum list1
목록에
임의 조작은 재귀 함수 사용하여 작성 될 수 :
을let rec sum l =
match l with
| [] -> 0
| head::tail -> head + (sum tail)
있지만, 대부분의 경우 사용하기 충분하다 내장 fold
기능 : 또한
let sum l =
List.fold (fun total element -> total + element) 0 l
참고 위의 '순진한'재귀 함수가 tail-recursive하지 않고,에 적용 할 때 그래서 충돌 것 매우 긴 목록. 기본적으로 fold
가하는 일입니다
let sum l =
let rec sumAcc acc l =
match l with
| [] -> acc
| head::tail -> sumAcc (acc+head) tail
sumAcc 0 l
: 꼬리 재귀 구현은 다음과 같이 될 것이다.
는 (I이 페이지에서 F 번호의 땅을 모르는 경우 다른 사람이 대답을 추가하고 - 목록을 F #으로 지원에 대해 그/그녀가 잘못된 아이디어를 얻을 수 있습니다) 그냥 완벽을 위해을 :
let sum l =
l
|> List.reduce (+)
도 트릭을 수행합니다.
let sum (l:list<int64>) =
l
|> List.reduce (+)
나이 :
let inline sum l =
l
|> List.reduce (+)
인라인 타입 추론은 다른 숫자 유형을 필요로하는 경우 당신이 (예를 들어, 갈망의 목록을) 할 수 있도록하는 int 목록으로 L을 추론한다 "+"라는 정적 함수를 제공하는 모든 유형에서 작동하도록 sum 함수를 일반화합니다. 를 사용하려면이 같은 코드를 가지고 것 :
let mylist = [1;2;3;4]
let sumOfMyList = sum mylist;;
나는 또한 내 경험에 그 목록을 사용하여 주름 및 관련 기능은 자신의 재귀 기능을 압연보다 더 좋은 방법입니다 말할 것입니다.
- 1. 배열과 ArrayClass 목록의 합
- 2. 광범위한 링크 목록의 확장자 찾기
- 3. 링크 된 목록의 포인터
- 4. 파일에서 입력 (링크 된 목록의 n 번째 요소 찾기)
- 5. 목록의 머리글 합
- 6. 목록의 교대 요소의 합
- 7. 스킴 목록의 숫자 합
- 8. AngularJS 목록의 동적 합
- 9. 프롤로그에 목록의 합
- 10. 링크 된 목록의 문제점
- 11. 링크 된 목록의 파이썬
- 12. 링크 된 목록의 정확성
- 13. 링크 된 목록의 문제
- 14. 링크 된 목록의 요소
- 15. Java에서 목록의 최대, 최소, 합 및 평균 찾기 8
- 16. 문자열 찾기 링크 된 목록의 한 노드의 길이
- 17. O (n) 시간보다 좋은 링크 된 목록의 항목 색인 찾기
- 18. 링크 된 목록에서 손상 찾기
- 19. 모든 지수의 합 찾기
- 20. 무한 수계의 합 찾기
- 21. 문자열로 된 링크 찾기
- 22. 스키마를 사용하는 목록의 숫자 합
- 23. 링크 된 목록의 벡터 만들기?
- 24. 링크 된 목록의 가비지 수집
- 25. 링크 된 목록의 특정 번호
- 26. 링크 된 목록의 끝에서 삭제
- 27. 링크 된 목록의 헤드 노드
- 28. 링크 된 목록의 마지막 노드
- 29. 연결된 목록의 링크 된 목록
- 30. 링크 된 목록의 더미 노드
패턴 일치에 '_'을 사용할 수 있다고 생각하지 않습니다. 맞습니까? 당신은 _ + (sum (! t)) –
을 가지고 있습니다. @JohnOriely 확신을 위해 그것을 바꿔서 테스트 해 보았습니다. –
실제로 잘못된 선언을 입력했기 때문에 작동하지 않습니다. 한번 더 볼 수 있니, 고마워! –