Количество положительных элементов в списке - PullRequest
1 голос
/ 11 ноября 2010

Я пытаюсь подсчитать количество положительных элементов в списке. Вот что у меня есть:

 (define howMany
   (lambda (list)
      (cond
         [(not (list? list)) 0]
         [(null? list) 0]
         [(> list 0) (+ 1 (howMany (cdr list)))])))

Он продолжает давать мне ошибку, "ожидает ввода действительного числа", как бы вы это исправили?

О, я называю это так:

(howMany '(6 7 8))

Ответы [ 4 ]

4 голосов
/ 12 ноября 2010

Вы не можете ожидать, что (> list 0) будет работать - list - это список, но > ожидает, что его аргументы будут числами.

Вы хотите увидеть, является ли первый элемент списка положительным, поэтому должно быть (> (car list) 0).

Однако: в вашем коде есть большая проблема: что произойдет, если первый элемент будет отрицательным или нулевым?

0 голосов
/ 12 ноября 2010

В вашем коде есть пара ошибок.

(> list 0) должно быть (> (car list) 0), поскольку вы хотите проверить, является ли первый элемент списка больше 0. Вы не можете применить реализацию по умолчанию > к списку.либо.

(+ 1 (howMany (cdr list))) также не удастся, так как howMany не всегда оценивается как число.Вы должны поддерживать счетчик, передавая его в качестве аргумента в рекурсивно вызываемую процедуру.Один из способов сделать это:

(define (howmany lst)
  (let loop ((n 0) (lst lst))
    (if (null? lst) n
      (loop (if (> (car lst) 0) (add1 n) n) (cdr lst)))))

Тест:

> (howmany '(1 2 3 4 5))
5
> (howmany '(1 2 3 -4 5))
4
> (howmany '(1 -2 3 -4 5))
3
> (howmany '(-1 -2 3 -4 5))
2
0 голосов
/ 12 ноября 2010
positiveCounter(seq)
  if typeof(first(seq)) == num
      if first(seq) > 0
          return positiveCounter(rest(seq) + 1
      else
          return positiveCounter(rest(seq)
  else
      #Handle Errors Somehow. 

Псевдокод для рекурсивного алгоритма, который я бы использовал.

Я не знаю ни схемы, ни Clojure (о чем мне напоминают квадратные скобки).

Или вы могли бы написатьзначительно более сложный аппликативный подход в Common Lisp - дополнительные новые строки для удобства чтения.

(defun positiveCounter (seq)
  (reduce #'+
          (mapcar
           #'(lambda (x)
               (if (atom x)
                   (if (> x 0) 1 0)
                   0))
           seq)))
0 голосов
/ 12 ноября 2010

Вот ваша проблема: (> list 0)

Вы сравниваете список с числом.Попробуйте (> (length list) 0) или (not (null? list)).Или любое другое ключевое слово Scheme для «условия по умолчанию в блоке cond»:

Редактировать: это то, что вы получаете, когда сосредотачиваетесь прежде всего на сообщениях об ошибках.Гарет, конечно, прав.

...