评估Scheme中的自然日志

时间:2013-02-12 02:48:08

标签: scheme

E = 1/0!+1/1!+1/2!+1/3!......

我写了这样的代码,但不管我输入什么,它只返回2 ....  你能帮帮我吗?

 (define (fact n)
        (if (= n 0)
            1
            (* n (- n 1))))

    (define (e limit)
            (if (= limit 0)
                1
                (+ (/ 1 (fact limit))  (e (- limit 1)))))

2 个答案:

答案 0 :(得分:2)

fact程序中存在错误:

(define (fact n)
  (if (= n 0)
      1
      (* n (fact (- n 1))))) ; you forgot to recursively call `fact`

彻底测试每个程序,一个简单的单元测试就会发现问题出在fact而不是e程序中。

答案 1 :(得分:1)

请告诉我,这不是为了你的功课,你只是在修补Scheme。 :)

对于2的任何输入,我都没有e。除e之外,0的任何输入都会出现除零错误。

除此之外,fact还有一个明显的问题。也许括号绊倒了你,你已经盯着这个太久了:

(define (fact n)
    (if (= n 0)
        1
        (* n (- n 1))))

......应该是:

(define (fact n)
    (if (= n 0)
        1
        (* n (fact (- n 1)))))

请记住,如果没有调用自身的函数,就无法实现递归函数。

这可以解决您的问题。

这些天可能没有TA可以帮助这么快,但如果这是为了你的功课,你需要努力将你遇到的问题分解为最简单的元素,以便在更多的编程中生存,这只会变得更加困难。特别是在这种情况下,您需要停下来询问fact所依赖的e是否真的有效,发现它没有,并从那里开始。