문제

이건 숙제라서 답을 듣고 싶지 않아요.올바른 방향으로 밀어주기만 하면 됩니다.여러 함수를 목록에 매핑해야 합니다.예를 들어:

(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)

첫 번째 함수를 목록의 요소에 매핑하도록 할 수 있지만 그 이후에는 매우 혼란스럽습니다.또한 입문용이므로 입문기능에 국한합니다(const, append, car, cdr, member, 등.)

(define (map-multi f l)  
    (cond  
        ((null? l)  
            l)  
        (else (cons ((car f) (car l))  
            (map-multi f (cdr l))))))  
도움이 되었습니까?

해결책

당신은 구성하다 귀하가 받는 기능은 f 매개변수.단순화를 위해 목록에 두 개의 함수만 있다고 가정해 보겠습니다. 그런 다음 숫자 목록의 현재 요소에 첫 번째 함수를 적용한 다음 그 결과에 두 번째 함수를 적용해야 합니다.당신이 사용할 수 있다면 compose 절차를 진행하고 코드에서 다음 줄을 변경하십시오.

((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?

...이것으로 :

((compose (cadr f) (car f)) (car l))       ; now we're applying both functions

사용할 수 없는 경우 compose, 같은 줄을 다음 줄로 바꿉니다.

((cadr f) ((car f) (car l)))               ; now we're applying both functions

이제 문제가 더 일반적이고 다음과 같이 함수 목록을 매핑해야 하는 경우 2개 이상 그런 다음 코드의 동일한 줄을 다음과 같이 한 번 더 바꿉니다.

((compose-multi f) (car l))

그리고 다음을 연속적으로 호출하여 목록의 모든 함수를 구성하고 반환하는 도우미 함수를 구현합니다. compose.이것은 숙제이므로 연습용으로 남겨 둡니다. 그러나 위 코드가 두 가지 함수에 대해 어떻게 작동하는지 이해했다면 결과를 여러 함수 목록으로 확장하는 것이 충분히 쉬울 것입니다.

(define (compose-multi flist)      ; procedure for composing a list of functions
  (if (null? flist)                ; if the list is empty then
      <???>                        ; return the identity function
      (<???> (compose-multi <???>) ; else compose the result of recursive call
             <???>)))              ; with the current element in the list

함수 목록에 요소가 없는 경우를 처리하려면 항등 함수가 필요합니다.정의하는 것은 매우 간단합니다. 매개변수로 전달된 것과 동일한 값을 반환하기만 하면 됩니다.

또한 compose-multi 반환합니다 기능, 목록의 모든 함수를 구성한 결과 - compose 이 작업을 수행하지만 사용이 허용되지 않는 경우 다음 사항을 기억하세요.

(compose x y)

...이는 다음과 같습니다:

(lambda (n) (x (y n)))

다른 팁

이것을 두 개의 함수로 작성하는 것이 더 쉬울 수도 있습니다.하나는 함수 목록과 단일 입력을 가져와 목록의 모든 함수를 순차적으로 적용합니다.한 함수 애플리케이션의 출력은 다음 함수 애플리케이션의 입력이 됩니다.기능이 부족해지면 작업이 완료됩니다.

다른 함수는 단순히 입력 목록 전체에 걸쳐 이 도우미 함수를 매핑합니다.

정의하는 다른 방법은 다음과 같습니다. multi-map 구성 대신에 다음과 같은 작업을 사용합니다. fold.소개 기능만 사용하도록 허용되었으므로 이는 실제로 귀하의 과제에 대한 답변이 아닙니다.하지만 당신이 자신만의 정의를 쓴다면 그렇게 될 것입니다. fold (그리 길지 않아요!)

(define (multi-map operations input)
  (fold map input operations))

> (multi-map (list 1+ square)
             '(4 10 8))
$2 = (25 121 81)

> (multi-map (list 1+ square 1+) 
             '(4 10 8))
$3 = (26 122 82)

따뜻해지려면 더 간단한 문제부터 시작하세요.그런 다음 솔루션을 일반화하십시오.

이 함수를 어떻게 작성하시겠습니까?

(define (map-single fs x)
  ...)

> (map-single (list double add1) 3)
7

목록이 필요합니다. fs, 인수 및 숫자로서의 함수 값, x, 그리고 함수의 (구성)을 적용한 값을 계산했습니다. fs 에게 x?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top