Как перейти во внутренний список в схеме? - PullRequest
1 голос
/ 24 апреля 2011

Я пишу процедуру, которая подсчитывает количество нулей в данном списке.Этот список может иметь другой вложенный список.Алгоритм, который я придумал, был очень прост:

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

Однако, я всегда получаю сообщение об ошибке:

 =: expects type <number> as 2nd argument, given: quote; other arguments were: 0  

, и я понятия не имеюкак это может бытьЕсть идеи?

Моя попытка была

(define (helper lst)    
  (cond ((null? lst) 0)
        ((= 0 (car lst)) (+ 1 (helper (cdr lst))))
        (else (+ 0 (helper (cdr lst))))))

(define (count-zeroes lst)
  (cond 
    ((null? lst) 0)
    (else 
      (if (list? (car lst)) 
          (+ (helper (car lst)) (count-zeroes (cdr lst)))
          (if (= 0 (car lst)) 
              (+ 1 (count-zeroes (cdr lst)))
              (+ 0 (count-zeroes (cdr lst))))))))

(define ll '(0 1 2 0 '(1 0 0)))

(count-zeroes ll)

Спасибо,

Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

Вам не нужен такой вспомогательный метод, как таковой.Метод count-zeroes может вызывать себя рекурсивно для машины, если машина представляет собой список.

Вместо этого я бы выбрал что-то подобное

(define (count-zeroes lst)
  (cond
    ((null? lst) 0)
    ((list? (car lst)) (+ (count-zeroes (car lst)) (count-zeroes (cdr lst))))
    ((equal? (car lst) 0) (+ 1 (count-zeroes (cdr lst))))
    (else (count-zeroes (cdr lst)))
   )
 )
1 голос
/ 24 апреля 2011

Прошло много времени с тех пор, как я практиковал схему, но:

A) Я не думаю, что cddr - это правильная процедура в (+ (helper (car lst)) (count-zeroes (cddr lst))) - это просто должен быть cdr.

B) Вам не нужна вторая вспомогательная функция - у вас должна быть возможность нормально вызывать (count-zeroes car lst), потому что в этот момент вы передаете список, который будет разделен так же, как и его родитель.

Таким образом, спорная строка будет (+ (count-zeroes (car lst)) (count-zeroes (cdr lst)))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...