2010-11-15 15 views
1

Je suis un débutant Scheme et j'essaie de donner un sens à mes devoirs. J'ai une fonction que j'ai appelé plus haut fait dupliquer, et il ressemble à ceci:Problème de schéma (en utilisant une fonction en tant que paramètre)

(DEFINE (duplicate lis) 
      (IF (NULL? lis) '()) 
      ((CONS (CAR lis) (CONS (CAR lis) (duplicate (CDR lis)))) 
     )) 

A i/o typique de ce serait i: (en double « (1 2 3 4)) o: (1 1 2 2 3 3 4 4), si fondamentalement il duplique tout dans la liste. Passant dessus: Maintenant je suis censé faire une fonction qui s'appelle comp. Il est censé être construit comme ceci:

(DEFINE (comp f g) (lambda (x) (f (g (x)))) 

où je pouvais entrée « (1 2 3 4) et il retournerait (1 1 4 4 9 9 16 16)

donc f = double et g = lambda. Je sais lambda devrait probablement ressembler à ceci:

(lambda (x) (* x x)) 

Mais ici est là que le problème commence, je l'ai déjà passé plusieurs heures à ce sujet, et comme vous pouvez le voir pas fait beaucoup de progrès.

Toute aide serait appréciée. Cordialement.

+1

1. Dans 'comp()' vous ne pouvez pas avoir '((x)'; 'x' n'est pas une fonction: elle devrait être' (gx) 'au lieu de' (g (x)) '2. Pour utiliser' comp' avec 'lambda', votre (lambda (x ..)) doit fonctionner sur une liste pour être compatible avec 'double '; tel qu'il est, ce «lambda» ne fonctionne que sur un seul nombre. C'est difficile à faire sans boucle. – frayser

Répondre

2

Utilisation map:

> (map (lambda (x) (* x x)) (duplicate '(1 2 3 4))) 
=> (1 1 4 4 9 9 16 16) 

ou modifier duplicate de prendre une procédure comme second argument et l'appliquer à chaque élément de la liste:

(define (duplicate lst p) 
    (if (null? lst)() 
     (append (list (p (car lst)) (p (car lst))) (duplicate (cdr lst) p)))) 

> (duplicate '(1 2 3 4) (lambda (x) (* x x))) 
=> (1 1 4 4 9 9 16 16) 
+0

Merci pour l'aide, je l'apprécie :) – CyberBuffalo

0

Une façon de faire est la suivante :

(define (comp f g) (lambda (x) (f (g x)))) 
(define (square x) (* x x)) 
(define (dup x) (list x x)) 
(define (duplicate-square lst) 
    (foldr append '() (map (comp dup square) lst))) 

Maintenant à la repl, faire:

> (duplicate-square '(1 2 3 4)) 
'(1 1 4 4 9 9 16 16) 
+0

Merci pour l'aide, je l'apprécie :) – CyberBuffalo