나는 당신이 좀 그래서 당신이 할 수있는 filter-sum
등을 만든 일반화 할 수 있습니다 상상 : 여기
#!r7rs ; #!r6rs for r6rs
(import (scheme) ; replace scheme with rnrs for r6rs
(only (srfi :1) filter fold)) ; remove filter for r6rs
;; I renamed you list
(define *lista-de-elemente* '(2 4 8 10 12 14 16))
(define (suma)
(define (>10? x)
(> x 10))
(filter-sum >10? *lista-de-elemente*))
(suma) ; ==> 42
이
filter-sum
의 몇 가지 가능한 버전입니다. 우리는 똑바로 앞으로 재귀 방법이 있습니다
(define (filter-sum predicate lst)
(cond ((null? lst) 0)
((not (predicate (car lst))) (filter-sum predicate (cdr lst)))
(else (+ (car lst) (filter-sum predicate (cdr lst))))))
을하지만 주문 또는 숫자가 중요하지 않기 때문에 매우 좋지 않다. 꼬리 재귀와
(define (filter-sum predicate lst)
(let loop ((lst lst)(acc 0))
(if (null? lst)
acc
(loop (cdr lst)
(if (predicate (car lst))
(+ acc (car lst))
acc)))))
지금과 같은 루프를하고 축적은 배로 변환 할 수 있습니다 : 우리는 대신에 겨드랑이 절차의 명명 된 let
여기, 어큐뮬레이터와 재귀이 꼬리를 할 수 있습니다. 추가하거나하지 말아야 경우 대부분의 코드
(define (filter-sum predicate lst)
(fold (lambda (x acc)
(if (predicate x)
(+ acc x)
acc))
0
lst))
현재 상황 : 당신은
SRFI-1 list library에 접어 찾을 수 있습니다. 겹의 모든 요소를 추가 할 수 있도록
filter
하면 필터링 할 수 있습니다 :
(define (filter-sum predicate lst)
(fold + 0 (filter predicate lst)))
filter
는 SRFI-1 목록 라이브러리도있다. 이제 10보다 큰 수의 목록이 짧다는 것을 안다면 ... fold
을 apply
으로 완전히 바꿀 수 있으며 그 수가 조금 더 빨라질 수도 있지만 목록 길이에 제한이 있습니다. (많은 스킴 시스템은 제한된 크기의 스택에서 인수를 푸시하는 반면 폴드는 한 번에 하나의 요소를 누적합니다.)