在Racket中递归传递参数

时间:2016-08-08 22:27:51

标签: racket

我在球拍中编写一个函数时遇到了麻烦,该函数应该采用另一个函数作为它的第一个参数而一个列表作为它的第二个参数。

对函数的初始调用似乎都很顺利但是当我尝试以函数作为参数递归调用它时,它需要函数的参数。我希望此参数函数作为递归函数传递,但用于评估定义中的其他位置。任何帮助将不胜感激。

(define apply-to-pairs
  (lambda (arg1 arg2)
    (if (or (equal? (length arg2) 0)
            (equal? (length arg2) 1))
        '()
        (cons (arg1 (car arg2) (car (cdr arg2)))
              (apply-to-pairs (arg1 (cdr (cdr arg2))))))))

这是我的代码并且它编译得很好但是当执行对apply-to-pairs的递归调用时,程序需要arg1的参数,而我只是希望它作为它所带来的函数定义传递。我得到错误'预期2个参数,但只找到1'因为它将(cdr (cdr arg2))视为它的参数,而我的意思是它是递归调用的第二个参数。

1 个答案:

答案 0 :(得分:3)

在对apply-to-pairs的递归调用中,您调用arg1而不是简单地将其作为值传递。也就是说,(arg1 (cdr (cdr arg2)))周围有一组额外的parens。完整的,你想要的是

(define apply-to-pairs
  (lambda (arg1 arg2)
    (if (or (equal? (length arg2) 0) (equal? (length arg2) 1))
        '()
        (cons (arg1 (car arg2) (car (cdr arg2)))
              (apply-to-pairs arg1 (cdr (cdr arg2)))))))

考虑将代码格式化为更多行,以便更容易发现这些错误。