我試圖創建一個簡單的遞歸函數,它接受一個列表,並根據列表元素應用相應的函數。輸入:解析列表以確定元素的類型
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)))))
'(CDR( cdr lis))'如果表達式都是正確的列表,那麼''就是一個列表。也許'(caddr lst)'會更適合,那麼你就不需要檢查'(car x)'是否是整數了。 – Sylwester