2010-12-12 5 views
0

Я хотел бы добавить четные элементы в список и написать следующий алгоритм, который я написал для достижения цели.Добавить элементы в список

Ошибки я получаю:

+: ожидает ввод < номера> в качестве 2-й аргумента, учитывая: # < пустоту>; другие аргументы: 4

Код:

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

Не могли бы вы посоветовать на я) ошибка б) логика алгоритма

Спасибо!

ответ

2

Во-первых, отступы ваш код правильно:

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

Вы не должны иметь if выражения, которые не имеют как истинные и ложные ветви. Вы должны помнить, что это не C, и все, что не является последним выражением, будет запущено, а затем выброшено.

Объединить последние два, если заявления в одно 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: Когда я писал «ничего, что это не последнее выражение будет работать, а затем выбрасываются», я имел в виду:

(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

спасибо erjiang. Я не понимаю, где вы сказали: «все, что не последнее выражение, будет запущено и выброшено». Можете ли вы рассказать об этом, пожалуйста? – Roy

+0

см. Мое редактирование ответа – erjiang

0

Другой ответ совершенно прав, но ваш интерфейс не очень схема-y. Это более распространенная форма с хвостовой рекурсией.

; 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)))))))