関数を定義することになっていますn! (N-Factorial)
。問題は、方法がわからないということです。これが私がこれまでに持っているものです、誰かがこれを手伝ってくれますか?Racket の条件がよくわからないので、説明していただけると助かります。
(define fact (lambda (n) (if (> n 0)) (* n < n)))
最初にドキュメントをよく見る必要があります。これは非常に単純な例ですが、解決策を試す前に基本を理解し、再帰的な手順を記述する方法を知っていることを確認する必要があります。いくつかのコメント:
(define fact
(lambda (n)
(if (> n 0)
; a conditional must have two parts:
; where is the consequent? here goes the advance of the recursion
; where is the alternative? here goes the base case of the recursion
)
(* n < n))) ; this line is outside the conditional, and it's just wrong
最後の式が間違っていることに注意してください。何をすべきかわかりませんが、そのままではエラーが発生します。それを削除して、条件文の本文を書くことに専念してください。
スキーム (または Lisp) の秘訣は、括弧をより複雑な形式に組み立てる際に、括弧の各セットの間のそれぞれの小さな部分を理解することです。
それでは、条件文から始めましょう。 if
3 つの引数を取ります。最初の引数を評価し、それが true の場合は 2 番目の引数を返し、最初の引数が false の場合は 3 番目の引数を返します。
(if #t "some value" "some other value") ; => "some value"
(if #f "some value" "some other value") ; => "some other value"
(if (<= 1 0) "done" "go again") ; => "go again"
cond
も機能します-条件付きのラケットの紹介をここで読むことができます: http://docs.racket-lang.org/guide/syntax-overview.html#%28part._.Conditionals_with_if__and__or__and_cond%29
関数は 2 つの異なる方法で定義できます。匿名関数アプローチを使用していますが、これは問題ありませんが、この場合ラムダは必要ないため、より単純な構文は次のとおりです。
(define (function-name arguments) result)
例えば:
(define (previous-number n)
(- n 1))
(previous-number 3) ; => 2
あなたが持っているようにラムダを使用すると、異なる構文を使用して同じことが達成されます(今のところ、他の違いについて心配する必要はありません):
(define previous-number* (lambda (n) (- n 1)))
(previous-number* 3) ; => 2
ちなみに、「*」はその名前の単なる別の文字であり、特別なものではありません(http://docs.racket-lang.org/guide/syntax-overview.html#%28part._.Identifiers%29を参照)。「!」関数名の最後にある は、多くの場合、その関数に副作用があることを意味しますが、n! この場合、関数の適切な名前です。
それでは、元の質問に戻って、関数定義と条件をまとめてみましょう。ウィキの定義の「再帰関係」を使用します。これは、再帰関数が適切になるためです。n が 1 未満の場合、階乗は 1 です。そうでない場合、階乗は n 未満の 1 の階乗の n 倍になります。コードでは、次のようになります。
(define (n! n)
(if (<= n 1) ; If n is less than 1,
1 ; then the factorial is 1
(* n (n! (- n 1))))) ; Otherwise, the factorial is n times the factorial of one less than n.
最後の節は私が望んでいたよりも少し密度が高いので、n = 2 について考えてみましょう: (define n 2) (* n (n! (- n 1))) ; => (* 2 (n! (- 2 1))) (* 2 (n! 1)) (* 2 1) 2
また、Racket を使用している場合、期待どおりに動作していることを確認するのは非常に簡単です。
(check-expect (n! 0) 1)
(check-expect (n! 1) 1)
(check-expect (n! 20) 2432902008176640000)