2010-12-12 4 views
0

Je voudrais ajouter les éléments pairs dans une liste et avoir l'algorithme suivant que j'ai écrit pour atteindre l'objectif.Ajouter des éléments pairs dans la liste

L'erreur que je reçois est:

+: < Numéro de type attend> comme 2ème argument donné: # < vide>; d'autres arguments étaient les suivants: 4

Le code:

(define (mylength alist cnt) 
    (if (null? alist) 
    0 

    (if (= (modulo cnt 2) 0)(+ (car alist) (mylength (cdr alist) (+ cnt 1))))) 
    (if (= (modulo cnt 2) 1)(mylength (cdr alist) (+ cnt 1)))) 

Pourriez-vous s'il vous plaît conseiller sur la i) erreur ii) la logique de l'algorithme

Merci!

Répondre

2

D'abord, indentez votre code correctement:

(define (mylength alist cnt) 
    (if (null? alist)          ; 
    0              ; this section is wasted because 
    (if (= (modulo cnt 2) 0)        ; it's not the last expression 
     (+ (car alist) (mylength (cdr alist) (+ cnt 1))))) ; 
    (if (= (modulo cnt 2) 1)    ; this if is the last expression, but 
    (mylength (cdr alist) (+ cnt 1)))) ; if it's false you get #<void> 

Vous ne devriez pas avoir if expressions qui ne sont pas les deux branches vrai et faux. Vous devez vous rappeler que ce n'est pas C, et tout ce qui n'est pas la dernière expression sera exécuté et ensuite jeté.

Combiner les deux derniers si les déclarations dans une déclaration if:

(define (mylength alist cnt) 
    (if (null? alist) 
    0 
    (if (= (modulo cnt 2) 0) 
     (+ (car alist) (mylength (cdr alist) (+ cnt 1))) 
     (mylength (cdr alist) (+ cnt 1))))) 

Edit: Quand j'ai écrit « tout ce qui est pas la dernière expression sera exécuté puis jeté », je voulais dire:

(begin 
    (+ 2 2) 
    (+ 4 1) 
    (+ 1 0) 
    (+ 1 1)) => 2 

(let ((x 5)) 
    (add1 x) 
    (+ x 2) 
    (* x 2)) => 10 

((lambda() 
    (if #t 3) 
    (if #f 0 4) 
    (if #t 2))) => 2 
+0

merci erjiang. Je ne comprends pas la partie où vous avez dit 'tout ce qui n'est pas la dernière expression sera exécuté et jeté'. Pouvez-vous élaborer sur cela s'il vous plaît? – Roy

+0

voir ma modification sur la réponse – erjiang

0

L'autre réponse est entièrement correcte, mais votre interface n'est pas très schématique. C'est une forme plus commune avec la récursivité de la queue.

; Assumes given a list of numbers. Returns sum of even indices. 
(define (mylength alist) 
    (let helper ((alist alist) (acc 0)) 
    (cond 
     ((null? alist) acc) 
     ((null? (cdr alist)) (+ acc (car alist))) 
     (else (helper (cddr alist) (+ acc (car alist))))))) 
Questions connexes