使用我的代码,我需要使用多个函数并将它们组合为一个函数,该函数的结果将为a和b之间的第n个素数。我需要使用的功能是gen-consecutive
filter
value-at-position
。
我的代码的问题在于,函数gen-consecutive
需要3个参数,即函数(f)和充当范围的a和b,我不确定将f
放在哪里nth-prime-between
函数中的实参。
我不断收到错误消息“ gen-conecutive:arity mismatch”,它期望3个参数(f a b)而不是2个参数(a b)
这是我的代码:
(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)))))
答案 0 :(得分:0)
您的程序中有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-between 1000 10000 2)时 您必须使用(素数?n)测试9000个数字。大概测试10个数字就足够了。 顺便说一下,存在任意长度的间隔,其中没有素数。 用素数测试数字N?您需要知道素数减去(平方根N)。您将它们存储在哪里? 如果这是一项艰巨的任务,则可以使用具有良好停止条件的Eratosthenes筛子编写程序。