2012-10-31 6 views
1
나는 다음과 같이 진행하는 축적 통화 노력하고있다

그러나계획, 어떻게 그대로 목록의 나머지를 떠나 목록에서 바로 음수 광장

(define (accumulate op initial sequence) 
    (if (null? sequence) 
     initial 
     (op (car sequence) 
      (accumulate op initial (cdr sequence))))) 

I에 의해 뭔가를 네모로 할 때 필터를 통해 선택하면 대답이 작동하지 않습니다. 내가 줄 입력이

(define (f2b items) 
    (accumulate (lambda (x y) 
    (cons (append 
     (map square (filter negative? (filter number? x))) x) y))() items) 
) 

입니다 :이 내가 지금까지 가지고하는 것은

(f2a '(("sdas" 89) (-53 "sad"))) 

내가 얻을 출력은 : 나는 부정적인를 얻이 수없는 것

((sdas 89) (2809 -53 sad)) 

떠날 번호.

+0

귀하의 * 입력 *은 무엇입니까? 두 목록의 중첩 목록이있는 것처럼 보이지만 코드가이를 처리하지 않습니다. –

+0

@GregHewgill 나는 내가주고있는 의견을 넣는다. –

답변

2

실제로 사용자가 설명하는 기능은 일반적으로 누적 기가 아닙니다. 대신 목록에서 음수를 제곱하면지도와 같은 것의 완벽한 작업처럼 보입니다.

첫째,하자 :

(define (make-positive x) 
    (if (and (number? x) (negative? x)) 
     (square x) 
     x)) 

을 이제 우리는 lst라는 목록에서 작동한다고 가정합니다. 단지

(map make-positive lst) 

우리는 두 가지 수준 깊은 중첩 된 목록에서 작동 할 필요가 있기 때문에

, 우리는 할 수는 '(1 "2" -5 -4 6)처럼, 단지 단순 목록라면, 우리가 수 :

(map (lambda (x) 
     (map make-positive x)) 
    lst) 

우리가 원하는 경우 임의 깊은 중첩 된 목록에서 작동하도록, 우리가 할 수있는 :

(define (nested-map fn elm) 
    (if (list? elm) 
     (map (lambda (x) (nested-map fn x)) elm) 
     (fn elm))) 

(nested-map make-positive lst) 

PS를 - 우리는이 같은 map을 정의 할 수 있습니다 :

(define (map fn lst) 
    (if (empty? lst) 
     '() 
     (cons (fn (car lst)) 
      (map fn (cdr lst))))) 
+0

고마워요! 나는 왜 내가 맵을 사용하지 않을 것이라고 확신하지 못한다. 그러나 이것은 완벽하게 이해할 수있다! –

2

필터와 맵을 사용하는 것이 훨씬 쉬울 것입니다. 필터는 미리 정의되어 있지만 다음과 같이 보입니다.

(define (filter1 predicate sequence) 
      (cond 
       ((null? sequence) null) 
       ((predicate (car sequence)) 
       (cons (car sequence) 
         (filter predicate (cdr sequence)))) 
       (else (filter predicate (cdr sequence))))) 

지도도 미리 정의되어 있으며 목록에 대한 기능 만 실행합니다.

이것은 매우 간단해야하지만, 필터에있는 술어에 대해 lamdba를 작성하면 도움이 필요합니다.