首页 文章

在Racket中递归传递参数

提问于
浏览
1

我在球拍中编写一个函数时遇到问题,该函数应该采用另一个函数作为第一个参数,列表作为第二个参数 .

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

(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的参数,而我只是希望它作为它所带来的函数定义传递 . 我得到错误'expected 2 parameters but only found 1'因为它正在查看 (cdr (cdr arg2)) 作为它的参数,而我的意思是它是递归调用的第二个参数 .

1 回答

  • 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)))))))
    

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

相关问题