【问题标题】:Scheme - Finding the sum of fractions from -n to n方案 - 查找从 -n 到 n 的分数之和
【发布时间】:2018-02-27 01:23:45
【问题描述】:

所以我必须创建一个名为 frac-sum 的函数,它将两个函数的分数的总和从 -n 到 n 所以 f(n)/g(n) 作为分数和从 -n 到 n 的总和所以 f(-n)/g(-n) + ... f(n)/g(n)

它需要三个形参 f g 和 n。

到目前为止,我有这个应该可以工作但最终进入递归循环,这意味着我的基本情况有问题:

    (define (negn n) (- (* n -1) 1))
    (negn 1)

    (define (frac-sum f g n)
      (cond ((= n (negn n)) 0)
            ((= (g n) 0) (+ 0 (frac-sum f g (- n 1))))
            ((+ (/ (f n) (g n)) (frac-sum f g (- n 1))))))

我用它来测试它应该输出两个:

(frac-sum (lambda (x) (- x 1)) (lambda(x) x) 1)

【问题讨论】:

  • 如果你用更直接和熟悉的符号n = -(n+1) 写下你的基本情况,可能更容易理解为什么它永远不会终止。

标签: algorithm sum scheme


【解决方案1】:

不存在一个整数n 声明n = (n * -1) - 1 将成立。这是您的函数无限循环的原因。

由于您想在[-n, n] 范围内进行迭代,您可以在函数中定义这两个值,然后递增下限,或递归递减上限。然后,您可以通过测试下限是否等于上限来终止函数。

(define (frac-sum f g n)
  (let loop ((neg (- n)) (pos n) (acc 0))
    (cond
      ((= neg pos) acc)
      ((zero? (g neg))
       (loop (add1 neg) pos acc))
      (else
       (loop (add1 neg) pos (+ (/ (f neg) (g neg)) acc))))))

例如:

(frac-sum (lambda (x) (- x 1)) (lambda (x) x) 1)
=> 2

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多