2017-10-07 5 views
1

J'ai essayé d'implémenter une boucle for à l'intérieur d'une fonction récursive en utilisant une boucle for. L'utilisation du "for" déjà implémenté dans la raquette n'est pas autorisée. Existe-t-il un moyen de mettre en œuvre un tel cas?Implémentation d'une boucle for in

Note: J'utilise une langue d'étudiant intermédiaire pour le même.

Répondre

0

Voici un exemple. La fonction squares produit une liste des premiers nombres carrés n. Pour produire cette liste, il boucle sur le nombre 0, ..., n-1 en utilisant un index i.

(define (squares n) 
    (define (loop i) 
     (if (= i n) 
      '() 
      (cons (* i i) (loop (+ i 1))))) 
    (loop 0)) 

(squares 10) 
+0

Lorsque j'utilise ce code, j'obtiens un tableau comme: "define: attendu une seule expression pour le corps de la fonction, mais trouvé 1 partie supplémentaire" – Deesha

+0

Derik si vous utilisez un langage d'enseignement, vous devez spécifier lequel. – soegaard

+0

Enveloppe la définition interne en local. Rechercher comment utiliser local. – soegaard

1

Tout d'abord for dans #lang racket est purement pour les effets secondaires. Habituellement, vous voudriez que les autres variantes comme for/map et for/fold finissent par produire une valeur. La raquette est une descendante de Scheme et toute la boucle est juste du sucre syntaxique pour une fonction récursive appliquée. A titre d'exemple la boucle do:

(do ((vec (make-vector 5)) 
    (i 0 (+ i 1))) 
    ((= i 5) vec) 
    (vector-set! vec i i))     
; ==> #(0 1 2 3 4) 

En réalité, la langue n'a pas do comme primitive. Au lieu de cela la mise en œuvre ont généralement une macro qui fait dans ce (ou quelque chose de similaire): il suffit de sucre

(let loop ((vec (make-vector 5)) (i 0)) 
    (if (= i 5) 
     vec 
     (begin 
     (vector-set! vec i i) 
     (loop vec (+ i 1))))) 

Ceci est bien sûr pour cela:

((letrec ((loop (lambda (vec i) 
        (if (= i 5) 
         vec 
         (begin 
          (vector-set! vec i i) 
          (loop vec (+ i 1))))))) 
    loop) 
(make-vector 5) (i 0)) 

Et bien sûr letrec est aussi le sucre .. Cela revient à utiliser lambda à un certain niveau.