2016-04-06 12 views
0

数字がプライムであるかどうかを調べるプログラムを作りたいと思います。2つの関数の代わりにラムダを使用するラケット

まず、私は動作しますが、2番目の引数として2を挿入するようユーザに要求するこの機能を作った:

(define (prim? number counter) 
    (if (>= counter number) 
     #t 
     (if (= (modulo number counter) 0) 
      #f 
      (prim? number (+ counter 1))))) 

だから私は、ユーザーが必要な情報のみを使用して機能を使用できるように望んでいました、彼がテストしたい番号。これは解決策でした:

私の質問は、lambdaを使用し、エレガントな機能を1つだけ持つことでコードを書き直すことができますか?だから私はこれを書いた:

(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で関数を書くことができますか?

+0

"lambda"を使いたくないと思うので、追加のパラメータを使って内部ヘルパープロシージャを定義し、名前付きの 'let'を使ってください。 –

答えて

4

私は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"を定義するより簡単です。

+0

私はちょうど新しいことを学んだ!ありがとう! –

関連する問題