使用 lambda 而不是 2 个函数的球拍

Racket using lambda instead of 2 functions

我想编写一个程序来判断一个数是否为素数。

首先我创建了这个函数,但需要用户插入 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> 而不是数字是否为质数。

如何使用 lambda 编写函数?

我认为使用命名的 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”更简单。