有没有更好的方法可以返回给定数字列表中的质数列表

时间:2019-02-16 06:01:45

标签: lisp racket

我知道这应该很简单。但是我是这种语言的新手,语法很难理解。

我做了一个函数来检查它是否是质数,而更大的函数只会创建仅包含质数的列表。

输入是任何给定的数字列表。假设'(2 3 7 8 4)然后它只应返回'(2 3 7)

所以我已经检查了我的primeHelper是否正常工作,只是用不同的号码呼叫primehelper。

(define (primeHelper x i)
  (cond
    ((<= x 1) #f)
    ((= x 2) #t)
    ((= x 3) #t) 
    ((zero? (modulo x i)) #f)
    ((not(zero? (modulo x i))) #t) 
    (else (primeHelper x (+ i 1)))))

(define (prime lis)
  (cond
    ((null? lis) (display "() list"))
    ((not(list? lis)) (display "this is an atom"))
    ((eq? (primeHelper (car lis) 2) #t)(cons (car lis) '()))
    (else (prime (cdr lis)))
    ))

我只是得到列表2

1 个答案:

答案 0 :(得分:4)

您的程序中有几个问题。

首先,primeHelper是错误的。例如,使用(primeHelper 33 2)进行尝试:它将返回#t,但33不是质数。

这里是正确的版本(具有递归功能):

(define (primeHelper x i)
  (cond ((<= x 1) #f)
        ((= x 2) #t)
        ((>= i x) #t)
        ((zero? (modulo x i)) #f)
        (else (primeHelper x (+ i 1)))))

此外,prime函数错误,其递归不正确。这是一个可能的正确版本:

(define (prime lis)
  (cond ((null? lis) '())
        ((primeHelper (car lis) 2) (cons (car lis) (prime (cdr lis))))
        (else (prime (cdr lis)))))

尝试一下:

(prime '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23))
'(2 3 5 7 11 13 17 19 23)