使用lambda而不是2个功能的球拍

时间:2016-04-06 18:34:46

标签: lambda racket primes

我想制作一个程序,找出一个数字是否为素数。

首先,我使这个功能有效,但要求用户插入2作为第二个参数:

(define (prim? number counter)
  (if (>= counter number)
      #t
      (if (= (modulo number counter) 0)
          #f
          (prim? number (+ counter 1)))))

所以我希望用户只能使用必要的信息,即他想要测试的数字来使用该功能。这是解决方案:

(define (is-prime? number)
  (prim? number 2))

(define (prim? number counter)
  (if (>= counter number)
      #t
      (if (= (modulo number counter) 0)
          #f
          (prim? number (+ counter 1)))))

我的问题是,如何使用lambdas重写代码并只有一个优雅的函数?所以我写了这个:

(define (prim number)
   (lambda(counter) (set! counter 2)   
     (if (>= counter number)
         #t
         (if (= (modulo number counter) 0)
             #f
             ((lambda(x) (set! counter (+ counter 1)))
              (prim number))))))

当我在REPL中运行(prim 5)时,它会向我显示消息#<procedure:D:/Racket/prim.rkt:5:2>,而不是数字是否为素数。

我怎么能用lambdas编写函数?

1 个答案:

答案 0 :(得分:4)

我认为使用名为letcond会更优雅,您应该不惜一切代价避免使用set!。试试这个:

(define (is-prime? number)
  (let prim? ((number number) (counter 2))
    (cond ((>= counter number) #t)
          ((= (modulo number counter) 0) #f)
          (else (prim? number (+ counter 1))))))

上面定义了一个名为prim?的内部辅助函数。这比定义“lambda”更简单。