Scheme - foo(x y)不调用递归调用

时间:2017-04-29 23:54:12

标签: recursion scheme

foo(x Y)是一个必须解决这个问题的程序 Picture. 这是我的计划代码:

(define foo
  (lambda (x y)
    (if (<= y 0) (x) 0)
    (if (<= x 0) (y) 0)
    (if (>= x y) (+ x foo ((- x 1) (- y 2)))  0)
    (if (< x y) (+ y foo ((- x 2) (- y 3))) 0)))

当它测试它时(foo 5 6)=&gt;它打印相同的确切数字,而不是12!我不知道为什么它没有通过递归电话..

1 个答案:

答案 0 :(得分:3)

此处没有递归调用。要成为一个电话,你需要在它周围加上括号,如(foo (- x 2) (- y 3))

只有最后if被视为该程序的结果。之前的所有值都返回一个值,因为它不是最后一个值,它会丢弃结果并继续下一个值。为了使几个条件意味着它们必须嵌套。因此,而不是0,你把整个下一个if

(define (foo x y)
  (if (<= x 0)
      x
      (if (<= y 0)
          y
          ...)))

还有cond使得更平坦的结构在其他语言中用作if-elseif-else

(define (foo x y)
  (cond
    ((<= x 0) x)
    ((<= y 0) y)
    ...
    (else ...)))