2014-04-01 59 views
0

我試圖創建一個簡單的遞歸函數,它接受一個列表,並根據列表元素應用相應的函數。輸入:解析列表以確定元素的類型

Input: (myfunct '(plus (minus(5 4) 3)) 
Output: 4 

因此,我檢查字符串是什麼,然後遞歸解決相應的表達式。

這就是我現在所擁有的(只是加):

(define (myfunct lis) 
    ((integer? (car lis)) (car lis)) 
    ((equal? 'plus (car lis)) (+ myfunct(car (cdr(lis)) myfunct(cdr(cdr lis)))))            
) 
//if its an integer, return it 
//if its plus, call myfunct with the 2 next heads of the list 

這會產生錯誤(在輸入 「(myfunct「(加4 5))」:

application: not a procedure; 
expected a procedure that can be applied to arguments 
    given: #f 
    arguments...: 
    plus 

我無法找出推理的錯誤,我可以請有一個解釋/修復

編輯:

(define (myfunct lis) 
    (cond ((integer? lis) lis) 
     ((integer? (car lis)) (car lis)) 
     ((equal? 'plus (car lis)) 
      (+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis))))))) 

適用於:(myfunct '(plus (plus 4 5) 6) 但是,它仍然不能用... (myfunct '(plus (plus 4 5) (plus 2 3)))。第二個參數不斷返回爲void「()」。我繪製了遞歸樹,並且我看不到任何該錯誤的原因。有任何想法嗎?

編輯2: 最終工作答案,而不是100%肯定,爲什麼這個工程,而不是其他的,我最好的猜測是,第二個參數是(在某種程度上)((加1)),而不是(加1 1),並且那輛車會返回錯誤的值。

(define (myfunct lis) 
    (cond ((integer? lis) lis) 
      ;;((integer? (car lis)) (car lis)) 
     ((equal? 'plus (car lis)) 
      (+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis))))) 
     (else (myfunct (car lis))))) 
+0

'(CDR( cdr lis))'如果表達式都是正確的列表,那麼''就是一個列表。也許'(caddr lst)'會更適合,那麼你就不需要檢查'(car x)'是否是整數了。 – Sylwester

回答

2

你有幾個問題與括號(有些缺失,有些是錯誤的,等等)使用IDE的工具捕捉類似這樣的錯誤。尤其是,圍繞在人體兩行的括號是錯誤的,因爲球拍認爲你想申請的程序 - 這就是爲什麼你得到一個application: not a procedure錯誤:

((integer? (car lis)) (car lis)) 
^       ^
wrong       wrong 

除此之外,你必須使用conditionalsif,cond等)來區分不同情況。而且你沒有正確處理每個表達式的部分,找出如何訪問列表的第一,第二和第三個元素。

我建議你在開始熟悉語法之後,先寫出更簡單的程序,然後再解決這個練習。我給你一些提示,讓你開始,填充了空白:

(define (myfunct lis) 
    (cond ((integer? lis) 
     lis) 
     ((equal? 'plus <first element>) 
     (+ (myfunct <second element>) (myfunct <third element>))) 
     (<similarly for the 'minus case>) 

如果一切正常,您所提供的樣品輸入應該按預期工作:

(myfunct '(plus 4 5)) 
=> 9 
(myfunct '(plus (minus 5 4) 3)) 
=> 4 
+0

通過您的代碼工作,我會在一分鐘內更新。試圖讓嵌套加上工作(單數加上正在工作)。 – Colton