使用 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 编写函数?
我认为使用命名的 let
和 cond
会更优雅,您应该不惜一切代价避免使用 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
”更简单。
我想编写一个程序来判断一个数是否为素数。
首先我创建了这个函数,但需要用户插入 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 编写函数?
我认为使用命名的 let
和 cond
会更优雅,您应该不惜一切代价避免使用 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
”更简单。