Search code examples
schemelispsisc

Recursive function not working as planned


I am writing a function in Scheme that is supposed to take two integers, X and Y, and then recursively add X/Y + (X-1)/(Y-1) + ...until one of the numbers reaches 0.

For example, take 4 and 3:

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

Here is my function which is not working correctly:

(define changingFractions (lambda (X Y)
    (cond 
        ( ((> X 0) and (> Y 0)) (+ (/ X Y) (changingFunctions((- X 1) (- Y 1)))))
        ( ((= X 0) or (= Y 0)) 0)
    )
))

EDIT: I have altered my code to fix the problem listed in the comments, as well as changing the location of or and and.

(define changingFractions (lambda (X Y)
    (cond 
        ( (and (> X 0) (> Y 0)) (+ (/ X Y) (changingFunctions (- X 1) (- Y 1) )))
        ( (or (= X 0) (= Y 0)) 0)
    )
))

Unfortunately, I am still getting an error.


Solution

  • A couple of problems there:

    • You should define a function with the syntax (define (func-name arg1 arg2 ...) func-body), rather than assigning a lambda function to a variable.
    • The and and or are used like functions, by having them as the first element in a form ((and x y) rather than (x and y)). Not by having them between the arguments.
    • You have an extra set of parens around the function parameters for the recursive call, and you wrote changingFunctions when the name is changingFractions.
    • Not an error, but don't put closing parens on their own line.
    • The naming convention in Lisps is to use dashes, not camelcase (changing-fractions rather than changingFractions).

    With those fixed:

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

    But you could change the cond to an if to make it clearer:

    (define (changing-fractions x y)
      (if (and (> x 0) (> y 0))
          (+ (/ x y) (changing-fractions (- x 1) (- y 1)))
          0))