我仍然在拍新的語言。 我實現球拍開關的情況下,但它無法正常工作。因此,我轉而使用平等和條件。我想知道如何調用一個需要輸入的函數。例如:階乘(n)函數 我想調用它:我該如何調用一個在球拍中帶參數的函數?
(if (= c 1) (factorial (n))
我仍然在拍新的語言。 我實現球拍開關的情況下,但它無法正常工作。因此,我轉而使用平等和條件。我想知道如何調用一個需要輸入的函數。例如:階乘(n)函數 我想調用它:我該如何調用一個在球拍中帶參數的函數?
(if (= c 1) (factorial (n))
在拍浪,與if
條件語句有語法:
(if <expr> <expr> <expr>)
所以你的情況,你必須提供另一個<expr>
。
(define (factorial n)
(if (= n 1) 1 (* n (factorial (- n 1)))))
;^exp ^exp ^exp
(factorial 3)
結果將是6
更新:
(define (factorial n)
(if (= n 1) 1 (* n (factorial (- n 1)))))
(define (triple x)
(* 3 x))
(define (switchcase c)
(if (= c 1)
(factorial c)
(if(= c 2)
(triple c) "c is not 1 or 2")))
(switchcase 2)
謝謝你,但iddnt這個意思..我的意思是: (定義事實(X)(如果(<= X 0)1(* X(事實( - ×1)))))) (定義三(x)(* 3 x)) 現在我有2 fxns,我想使用一個開關情況下ddnt工作,所以我使用的條件。但它仍然給我錯誤的函數調用部分? (if(= c 1)(fact(x))) (if(= c 2)(triple(x)))) 如果你能幫我用輸入和切換像在c + +的情況下,將不勝感激。謝謝 – user3080673
@ user3080673你應該忘記試圖在Racket中編寫C++。瘋狂就在於這種方式。你正在學習一種不同的語言,而不是一種不同的語法。 – molbdnilo
@ user3080673查看我的更新 –
有兩個句法問題與此片段:
(if (= c 1) (factorial (n)))
對於初學者來說,在一個if
表達球拍需要三部分:
(if <condition> <consequent> <alternative>)
修復將是提供當c
等於1
,另一個如果c
將運行不等於1
將要執行的表達式的第一件事情。再說了,這樣的事情:
(if (= c 1) 1 (factorial (n)))
現在的第二個問題:在方案中,當你周圍用括號標誌就意味着你要執行的功能。所以,如果你寫(n)
,解釋認爲,n
是不帶參數的函數,並且你要調用它。爲了解決這個問題,只需刪除()
周圍n
:
(if (= c 1) 1 (factorial n))
現在的語法問題的出路,讓我們來看看邏輯。在方案中,我們通常使用遞歸來表達解決方案,而是一個遞歸必須在某個時刻提前,所以它終將結束。如果你繼續傳遞相同的參數給遞歸,而不修改它,你會陷入無限循環。下面就來寫一個遞歸factorial
過程的正確方法:
(define (factorial n)
(if (<= n 0) ; base case: if n <= 0
1 ; then return 1
(* n (factorial (- n 1))))) ; otherwise multiply and advance recursion
注意我們是如何在每一步遞減n
,以確保它最終會達到零,結束了遞歸。一旦你對這個解決方案感到滿意,我們可以考慮讓它變得更好。閱讀tail recursion,看看編譯器如何優化我們的循環,只要我們以這樣一種方式編寫它們,即每個執行路徑上完成的最後一件事情就是遞歸調用,在它之後沒有任何事情要做。舉例來說,上面的代碼可以更有效地寫成如下,看看我們如何通過積累答案中的一個參數:
(define (factorial n)
(let loop ([n n] [acc 1])
(if (<= n 0)
acc
(loop (- n 1) (* n acc)))))
UPDATE
考慮看看的意見後,我看到您要執行switchcase
過程。再一次,你聲明函數的方式有問題。這是錯誤的:
(define fact(x)
正確的方法是這樣的:
(define (fact x)
而對於實際執行switchcase
,很可能因爲你試圖使用嵌套if
S,但是這不是最好的方式。瞭解如何使用cond
表達式或case
表達式,其中任一個都可以使您的解決方案更簡單。反正你必須提供一個附加條件,如果c
既不是1
也不2
。另外,你混淆了參數名稱 - 是c
還是x
?有了所有建議,這裏是你的代碼應該是什麼樣子:
(define (switchcase c)
(cond ((= c 1) (fact c))
((= c 2) (triple c))
(else (error "unknown value" c))))
如果你想要的東西很多接近給定的,你可以返回程序的開關情況。
(define (switch input cases)
(let ((lookup (assoc input cases)))
(if lookup
(cdr lookup)
(error "Undefined case on " input " in " cases))))
(define (this-switch c)
(let ((cases (list (cons 1 triple)
(cons 2 factorial))))
((switch c cases) c)))
你的代碼已經調用了帶有兩個參數(即「c」和「1」)的兩個參數的函數(即'=')。你沒有在括號中包括'c'和'1',你也不應該包裝'n'。 –