2013-12-15 36 views
1

我仍然在拍新的語言。 我實現球拍開關的情況下,但它無法正常工作。因此,我轉而使用平等和條件。我想知道如何調用一個需要輸入的函數。例如:階乘(n)函數 我想調用它:我該如何調用一個在球拍中帶參數的函數?

(if (= c 1) (factorial (n)) 
+0

你的代碼已經調用了帶有兩個參數(即「c」和「1」)的兩個參數的函數(即'=')。你沒有在括號中包括'c'和'1',你也不應該包裝'n'。 –

回答

0

在拍浪,與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) 
+0

謝謝你,但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

+1

@ user3080673你應該忘記試圖在Racket中編寫C++。瘋狂就在於這種方式。你正在學習一種不同的語言,而不是一種不同的語法。 – molbdnilo

+0

@ user3080673查看我的更新 –

2

有兩個句法問題與此片段:

(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)))) 
0

如果你想要的東西很多接近給定的,你可以返回程序的開關情況。

(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))) 
相關問題