我正在尝试创建一个简单的递归函数,它接受一个列表,并根据列表的元素应用适当的函数。输入时:
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)))
一起使用。第二个论点不断回归无效"()"。我绘制了递归树,但我无法找到该错误的原因。有什么想法吗?
编辑2: 最后的工作答案,不是百分之百确定为什么这个有效而不是另一个,我最好的猜测是第二个参数是(在某一点上)((加1 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 :(得分:2)
括号中有几个问题(有些问题丢失,有些错位等)使用IDE的工具来捕捉这样的错误。特别是,围绕身体两条线的括号是错误的,因为Racket认为你正在尝试应用一个程序 - 这就是你得到application: not a procedure
错误的原因:
((integer? (car lis)) (car lis))
^ ^
wrong wrong
除此之外,您必须使用conditionals(if
,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