簡體   English   中英

使用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)))))

然后我的問題是,如何使用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編寫函數?

我認為使用命名的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?的內部幫助器函數prim? 這比您建議的定義“ lambda ”要簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM