![](/img/trans.png)
[英]Using Racket ISL to define functions using list abstractions and local/lambda
[英]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)))))
然后我的問題是,如何使用lambda並僅具有一個優雅的功能來重寫代碼? 所以我這樣寫:
(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編寫函數?
我認為使用命名的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?
的內部幫助器函數prim?
。 這比您建議的定義“ lambda
”要簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.