递归函数不按计划工作

KOB*_*KOB 1 lisp scheme sisc

我在Scheme中编写一个函数,它应该采用两个整数,X和Y,然后递归添加,X/Y + (X-1)/(Y-1) + ...直到其中一个数字达到0.

例如,取4和3:

4/3 + 3/2 + 2/1 = 29/6

这是我的功能无法正常工作:

(define changingFractions (lambda (X Y)
    (cond 
        ( ((> X 0) and (> Y 0)) (+ (/ X Y) (changingFunctions((- X 1) (- Y 1)))))
        ( ((= X 0) or (= Y 0)) 0)
    )
))
Run Code Online (Sandbox Code Playgroud)

编辑:我已经改变了我的代码来解决在评论中列出的问题,以及不断变化的位置orand.

(define changingFractions (lambda (X Y)
    (cond 
        ( (and (> X 0) (> Y 0)) (+ (/ X Y) (changingFunctions (- X 1) (- Y 1) )))
        ( (or (= X 0) (= Y 0)) 0)
    )
))
Run Code Online (Sandbox Code Playgroud)

不幸的是,我仍然收到错误.

jki*_*ski 5

那里有几个问题:

  • 您应该使用语法定义函数(define (func-name arg1 arg2 ...) func-body),而不是将lambda函数赋值给变量.
  • andor用于相同功能的,通过使它们与第一元件的形式((and x y)而不是(x and y)).不要在参数之间加入它们.
  • 在递归调用的函数参数周围有一组额外的parens,你changingFunctions在名字时写了changingFractions.
  • 这不是一个错误,但不要把关闭的问题放在自己的行上.
  • Lisps中的命名约定是使用破折号changing-fractions而不是camelcase(而不是changingFractions).

有了那些修复:

(define (changing-fractions x y)
  (cond 
   ((and (> x 0) (> y 0)) (+ (/ x y) (changing-fractions (- x 1) (- y 1))))
   ((or (= x 0) (= y 0)) 0)))
Run Code Online (Sandbox Code Playgroud)

但你可以改变condif以使其更清晰:

(define (changing-fractions x y)
  (if (and (> x 0) (> y 0))
      (+ (/ x y) (changing-fractions (- x 1) (- y 1)))
      0))
Run Code Online (Sandbox Code Playgroud)