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 '(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)))))
4

1 回答 1

2

括号有几个问题(有些丢失,有些放错位置等)。使用 IDE 的工具来捕获此类错误。特别是,正文中两行周围的括号是错误的,因为 Racket 认为您正在尝试应用程序 - 这就是您收到application: not a procedure错误的原因:

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

除此之外,您必须使用条件ifcond等)来区分不同的情况。而且您没有正确处理每个表达式的部分,弄清楚如何访问列表的第一个、第二个和第三个元素。

我建议您先熟悉语法,然后再编写更短、更简单的程序,然后再进行此练习。我会给你一些提示让你开始,填空:

(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
于 2014-04-01T04:27:35.343 回答