Добавить четные элементы в список - PullRequest
0 голосов
/ 12 декабря 2010

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

Я получаю сообщение об ошибке:

+: ожидает тип в качестве второго аргумента, учитывая: # ;другими аргументами были: 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))))

Не могли бы вы сообщить об i) ошибка ii) логика алгоритма

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 декабря 2010

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

(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 в один оператор 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)))))

Редактировать: Когда я писал «все, что не является последним выражением, будет выполняться, а затем выбрасываться», я имел в виду:

(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 голосов
/ 14 декабря 2010

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

; 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)))))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...