2012-03-28 56 views
2

首次stackoverflow用戶,但偶爾潛伏者,希望你們可以幫我。請幫我理解方案:沒有參數?

因此,我的任務的第一部分是將所有「前導零」放在列表中。

例如:(0 0 0 0 0 1 0 1 0 1) - >(1 0 1 0 1)

要做到這一點,我認爲使用IF語句來檢查的第一個元素是否是一個0或不是,遞歸調用列表的其餘部分,直到沒有更多的前導零。由於我基本上不知道如何在Scheme中編程,通過搜索互聯網,我想出了你在下面看到的內容。但是,當我運行它時,DrRacket告訴我沒有任何參數 - 我認爲這是一個語法錯誤..或者更可能,我不知道我在做什麼。所以,如果你能幫助我,我會很感激!

>(define zz 
    > (lambda (n) 
    > (if (= (car (n)) 0) 
    >  (zz (cdr (n))) 
    >  ((n))))) 
    > 
    >(remove '(0 0 0 0 1 0 1 0)) 

我DrRacket得到的錯誤是:

「程序的應用程序:預計程序,因爲:(0 0 0 0 1 0 1 0)(無參數)」

再次感謝很多! (如果格式有點奇怪PS對不起...)

編輯

好了,改變了一些東西,我現在得到一個「期望類型作爲第一個參數,因爲:(0 0 0 0 0 1 0 1 0);其他參數是:0「錯誤標記在我的if語句。

>(define zz 
    > (lambda n 
    > (if (= (car n) 0) <----- here 
    >  (zz(cdr n)) 
    >  (n)))) 

EDIT 2

>(define zz 
    > (lambda (n) 
    > (if (= (car n) 0) 
    >  (zz (cdr n)) 
    >  n))) 

它的工作原理,非常感謝你!

回答

2

(num)是不正確的 - 你試圖撥打42或其他任何命令。 (另外,您的if語法已關閉;您可能想要閱讀更多代碼以更好地理解語法)。

這應該編譯:

(define remove 
    (lambda (num) 
    (if (= (car num) 0) 
     (remove (cdr num)) 
     num))) 

括號Lisp中是調用函數,除非在報價中。


好吧,OP詢問Scheme的語法的一般概要。

  • a - 一個符號,它由評估者查找並替換其值。一些符號(如42)會自行評估。

  • 'a - 該「引號」符號並將其轉換爲(quote a)quote防止評估參數 - 而是返回值a不是字符串「a」,不是查詢結果a,a本身。這也適用於列表('(1 2 3)

  • (if <expr> <true-value> <false-value>) - 這將評估<expr>,並查看其值是否爲真,並執行相應的值。

  • (cond (<expr> <true-value>) ... (else <false-value>)) - 這會通過它的參數運行,並評估它的car以查看它是否爲真。如果是,則返回評估cdr的值。否則,它跳到下一個值。

  • (define <name> <expr>) - 將評估第二個參數的值設置爲第一個參數的名稱。

  • (lambda <arg-list> <body>) - 創建一個過程,該過程是將傳入的參數綁定到第二個參數中存在的名稱並計算第三個參數的結果。

  • (<func> <arg1> <arg2> ... <argn>) - 如果評估者發現上述模式都不匹配,則它將該列表的car作爲函數使用,參數爲cdr

+0

@ Scheme.Is.Strange對不起 - 我打給'='的電話已關閉。檢查更新的示例。 – new123456 2012-03-28 23:36:53

+0

是的,你的代碼是完美的,你介意解釋scheme語法是如何工作的嗎?我知道我的問題含糊不清,問了很多,但只是一些提示會很好。 – 2012-03-28 23:40:30

+0

好吧,我想我會更熟悉Scheme,非常感謝! – 2012-03-28 23:46:00