scheme - 递归函数没有按计划工作

标签 scheme lisp 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)
    )
))

编辑:我修改了我的代码以修复注释中列出的问题,并更改了 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)
    )
))

不幸的是,我仍然遇到错误。

最佳答案

这里有几个问题:

  • 您应该使用语法 (define (func-name arg1 arg2 ...) func-body) 定义函数,而不是将 lambda 函数分配给变量。
  • andor 像函数一样使用,将它们作为表单中的第一个元素((and x y) 而不是(x 和 y))。不是让他们在争论之间。
  • 您在递归调用的函数参数周围有一组额外的括号,并且当名称为 changingFractions 时您编写了 changingFunctions
  • 不是错误,但不要将右括号放在自己的行上。
  • Lisps 中的命名约定是使用破折号,而不是驼峰式(changing-fractions 而不是 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)))

但是您可以将 cond 更改为 if 以使其更清晰:

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

关于scheme - 递归函数没有按计划工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35205097/

相关文章:

scheme - 在 Scheme 中全局存储值

scheme - 这是 OOP 的思想吗?

lisp - 如何检查符号是否为 T?

scheme - SRFI 40(已弃用)和 41 之间的主要区别是什么?

list - 替换列表中第一次出现的元素

visual-studio-code - 如何在 Visual Studio Code 上运行 Scheme?

scheme - 麻省理工学院计划中值程序

LISP 复制函数

networking - 为什么我在 Racket 上的网络服务器不会多次接收数据?