方案:不是程序(Dr. Racket)

时间:2017-04-09 20:24:35

标签: scheme r5rs

我正在使用R5RS计划在Dr. Racket中运行此程序,我在行(+ 1 IntDivide((- x y) y))上收到此错误:

  

“申请:不是程序;预期程序可以   适用于给出的参数:5个参数......:“

该过程应该使用减法返回两个整数之间的除法的商。由于这是一个家庭作业问题,我不会问我的解决方案是否正确(我可以稍后调试),而是导致此错误的原因。它似乎通常由多余的括号引起,但我似乎无法找到它们。任何帮助将不胜感激。

(define IntDivide (lambda (x y)
  (if (eqv? (integer? x) (integer? y))
    (begin
      (if (= y 0)
        (begin
          (write "Can't divide by zero") (newline)
          -1
        )
      )

      (if (= (- x y) 0)
        1
      )

      (if (< x y)
        0
      )

      (if (> x y)
        (+ 1 IntDivide((- x y) y))
      )
    )
  )
  (write "Please only input integers")
))

提前致谢!

2 个答案:

答案 0 :(得分:3)

除了在parens中移动操作员之外,还需要将if替换为cond

(define IntDivide
  (lambda (x y)
    (if (eqv? (integer? x) (integer? y))
      (cond ((= y 0) (write "Can't divide by zero")
                     (newline)
                     -1)
            ((= x y) 1)
            ((< x y) 0)
            ((> x y) (+ 1 (IntDivide (- x y) y))))
      (write "Please only input integers"))))

你现在的方式,内部if表达式,将无法正常工作,因为它们不会自动返回。他们只是评估然后结果被扔掉了。

答案 1 :(得分:2)

以与其他任何功能相同的方式呼叫IntDivide

(+ 1 (IntDivide (- x y) y))