我正在尝试创建一个简单的递归函数,它接受一个列表,并根据列表的元素应用适当的函数。输入时:
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 '(plus 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 1),并且car 会返回错误的值。
(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)))))