Arity Mismatch: куда поместить параметр - PullRequest
0 голосов
/ 14 октября 2018

В моем коде мне нужно использовать несколько функций и объединить их в одну, которая будет вычислять n-е простое число между a и b.Мне нужно использовать следующие функции: gen-consecutive filter value-at-position.

Проблема с моим кодом состоит в том, что для функции gen-consecutive требуется 3 параметра: функция (f) и a и b, которые действуюткак диапазон, и я не уверен, куда поместить аргумент f в моей функции nth-prime-between.Я продолжаю получать сообщение об ошибке «gen-последовательный: несоответствие арности» и ожидать, что вместо 2 аргументов (ab) ожидается 3 аргумента (fab)

Вот мой код:

(define (nth-prime-between a b n)
   (value-at-position filter prime? (gen-consecutive a b)) n)

Вот другие функции:

(define (gen-consecutive f a b)
  (if (>  a b)
      '()
      (cons (f a) (gen-consecutive f (+ a 1) b))))

(define (filter f lst)
   (cond ((null? lst) '())
        ((f (car lst))
         (cons (car lst) (filter f (cdr lst))))
        (else
         (filter f (cdr lst)))))

(define (value-at-position lst k)
  (cond ((null? lst) lst)
        ((= k 1) (car lst))
        (else (value-at-position (- k 1) (cdr lst)))))

1 Ответ

0 голосов
/ 15 октября 2018

В вашей программе 3 ошибки!У меня нет функции простого ?, поэтому я использовал нечетное?вместо этого

(define (nth-prime-between a b n)

  ;; missing parenthesis for the function filter
  ;; n is value of the function
  ;; (value-at-position filter odd? (gen-consecutive a b)) n)

  (value-at-position (filter odd? (gen-consecutive a b)) n))

;; kill the parameter f
;;
;; (define (gen-consecutive f a b)
;;   (if (>  a b)
;;       '()
;;       (cons (f a) (gen-consecutive f (+ a 1) b))))

(define (gen-consecutive a b)
  (if (>  a b)
      '()
      (cons a (gen-consecutive (+ a 1) b))))

(define (filter f lst)
     (cond ((null? lst) '())
        ((f (car lst))
         (cons (car lst) (filter f (cdr lst))))
        (else
          (filter f (cdr lst)))))

 (define (value-at-position lst k)
     (cond ((null? lst) lst)
        ((= k 1) (car lst))
         ;; the sequence of (- k 1) and (cdr lst) is wrong
         ;; (else (value-at-position (- k 1) (cdr lst)))))
         (else (value-at-position (cdr lst) (- k 1)))))

 (define (odd? N)
   (if (= (remainder N 2) 0)
      #f
      #t))

(nth-prime-between 1 10 3)

Более глубокая проблема с задачей: Когда вы звоните (nth-prime-между 1000 10000 2), вы должны проверить 9000 номеров с помощью (prime? n).Возможно, достаточно протестировать 10 номеров.Кстати, существуют интервалы любой длины без простых чисел.Чтобы проверить число N с простым?вам нужно знать простые числа за вычетом (квадратный корень N).Где вы будете их хранить?Если это серьезная задача, вы можете написать программу, используя сито Эратосфена с умным условием остановки.

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