Domanda

Questo è il compito, quindi non voglio la risposta.Ho solo bisogno di una spinta nella giusta direzione.Sono tenuto a mappare più funzioni su un elenco.Ad esempio:

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

Sono in grado di farla mappare la prima funzione agli elementi dell'elenco, tuttavia, mi sento molto perso dopo.Inoltre, poiché questo è introduttivo, sono limitato alle funzioni introduttive (const, append, car, cdr, member, ecc.)

(define (map-multi f l)  
    (cond  
        ((null? l)  
            l)  
        (else (cons ((car f) (car l))  
            (map-multi f (cdr l))))))  
.

È stato utile?

Soluzione

È necessario Componi le funzioni che si ricevono nel parametro f. Per la semplicità, diciamo che ci sono solo due funzioni nell'elenco, quindi è necessario applicare la prima funzione all'elemento corrente nell'elenco dei numeri e quindi applicare la seconda funzione al risultato di ciò. Se è possibile utilizzare compose Procedura Vai avanti con esso e cambia questa riga nel tuo Codice:

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

... con questo:

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

Se non è possibile utilizzare compose, quindi sostituire la stessa riga con questo:

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

Ora, se il problema è più generale e è necessario mappare un elenco di funzioni con più di due elementi , quindi ancora una volta sostituisci la stessa riga nel codice con questo: .

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

e implementare una funzione di aiutante che compone e restituisce tutte le funzioni nell'elenco, da chiamate successive a compose. Questo è lasciato come un esercizio per te, dato che è un compito - ma se capisci come il codice di cui sopra funziona solo per due funzioni, dovrebbe essere abbastanza facile da estendere il risultato per un elenco di funzioni multiple:

(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
.

Si noti che la funzione di identità è necessaria per la gestione del caso in cui non ci sono elementi nell'elenco delle funzioni; È molto semplice definire, restituisce solo lo stesso valore che è stato passato come parametro.

anche consapevole che compose-multi restituisce una funzione , il risultato della composizione di tutte le funzioni nell'elenco - compose fa questo per te, ma se non ti è permesso di usarlo, ricorda questo :

(compose x y)
.

... è equivalente a questo:

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

Altri suggerimenti

Potrebbe essere più facile scrivere questo come due funzioni.Si effettua un elenco di funzioni e un singolo input e applica tutte le funzioni nell'elenco in serie.L'output da un'unica applicazione sarà l'ingresso per quello successivo;Una volta che hai esaurito le funzioni che hai finito.

L'altra funzione è sufficiente mappare questa funzione di aiutante su un elenco di ingressi.

Ecco un modo alternativo per definire multi-map che invece della composizione utilizza l'operazione chiamata fold.Dal momento che ti è permesso solo di utilizzare le funzioni introduttive, questa non è davvero la risposta al tuo incarico.Ma sarà, se scrivi la propria definizione di fold (non è molto lungo!)

(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)
.

Per riscaldarsi, iniziare con un problema più semplice.Quindi generalizzare la soluzione.

Come scriveresti questa funzione?

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

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

Prende un elenco, fs, dei valori delle funzioni come argomento e un numero, x e calcolato il valore dell'applicazione della (composizione di) funzioni in fs a x?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top