2016-10-02 3 views
1

Comment écrire une procédure qui multiplie chaque élément de la liste avec un nombre donné (x) .Si je donne une liste '(1 2 3) et x = 3 , la procédure doit retourner (3 6 9)multiplier la liste des articles par un certain nombre 'x'

Mon essai:

(define (mul-list list x) 
(if (null? list) 
1 
(list(* x (car list))(mul-list (cdr list))))) 

le code ci-dessus ne marche pas semblent work.What changements dois-je faire? S'il vous plaît aider

Merci d'avance.

Répondre

1

C'est l'exemple du livre de texte où vous devez utiliser map, au lieu de réinventer la roue:

(define (mul-list lst x) 
    (map (lambda (n) (* x n)) lst)) 

Mais je suppose que vous voulez mettre en œuvre à partir de zéro. Votre code a les problèmes suivants:

  • Vous ne devez pas appeler list un paramètre, que les affrontements avec la procédure intégrée du même nom - celui que vous essayez d'utiliser actuellement!
  • Le cas de base doit retourner une liste vide, étant donné que nous construisons une liste en tant que sortie
  • Nous construisons des listes par cons éléments ing, et non en appelant list
  • Vous avez oublié de passer le second paramètre à la récursif appel de mul-list

Cela devrait corriger tous les bugs:

(define (mul-list lst x) 
    (if (null? lst) 
     '() 
     (cons (* x (car lst)) 
      (mul-list (cdr lst) x)))) 

de toute façon, cela fonctionne comme prévu:

(mul-list '(1 2 3) 3) 
=> '(3 6 9) 
+0

Merci beaucoup! Pouvez-vous s'il vous plaît me suggérer un livre de débutants pour apprendre le régime :) – mike

+0

@mike sûr, avec plaisir :). "The Little Schemer" et "Comment concevoir des programmes" sont fantastiques, et "Structure et interprétation des programmes informatiques" est l'un des meilleurs livres de programmation jamais écrit, même si c'est un peu plus avancé –

+0

Merci beaucoup :) Óscar López. C'était une belle liste – mike

0

Pour et ses extensions (pour *, pour/liste, pour/Tout d'abord, pour/dernier, pour/somme, pour/produit, pour/et, pour/ou etc: https://docs.racket-lang.org/reference/for.html) sont très utiles pour boucles Racket:

(define (ml2 lst x) 
    (for/list ((item lst)) 
    (* item x))) 

Test:

(ml2 '(1 2 3) 3) 

sortie:

'(3 6 9) 

Je trouve que dans de nombreux cas, l'implémentation «for» fournit un code court, simple et facilement compréhensible.