我想制作一个程序,找出一个数字是否为素数。
首先,我使这个功能有效,但要求用户插入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编写函数?
答案 0 :(得分:4)
我认为使用名为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
”更简单。