Главный подсчет с использованием схемы - PullRequest
1 голос
/ 23 сентября 2019

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

Тот, который работает -

define (count-primes t)
  (cond((= t 1) 0)
       ((prime? t) (+ 1 (count-primes (- t 1))))
       (else (count-primes(- t 1)))
       )

Тот, который не работает -

(define x 0)
(define (count-primes t)
  (cond((= t 1) x)
       ((prime? t) (+ x 1) (count-primes (- t 1)))
       (else (count-primes(- t 1)))
       )
  )

1 Ответ

2 голосов
/ 23 сентября 2019

Проблема с (+ x 1) выражением.Если вы хотите увеличить некоторую переменную в Scheme, вам нужно присвоить ей новое значение:

(set! x (+ x 1))

Недостаточно просто добавить некоторые значения, как вы это сделали.Он просто добавляет их, а затем игнорирует результат, потому что вы не указали, что с ним делать.

Вы также можете переопределить эту функцию, чтобы получить еще один необязательный аргумент и передать x таким образом, избегая определения имутирует x отдельно.Что-то вроде:

(define (count-primes t . x)
  (cond ((= t 1) (car x))
        ((prime? t) (+ x 1) (count-primes (- t 1) (+ (car x) 1)))
        (else (count-primes (- t 1) (car x)))))

Обратите внимание, что вы должны принять car из x, потому что x на самом деле список всех необязательных аргументов, но мы используем только первый, поэтому - car.

...