繁体   English   中英

方案:递归zeno函数

[英]Scheme: recursive zeno function

以下是一个将1/2 ^ n加到0的函数。 有人可以告诉我是否需要else语句,以及如何排列括号以确保没有编译错误吗?

(define (zeno n)
  (if (= n 0)
      (+ 0)
      (else
        ((+ (/ 1 (expt 2 n )))
         ((zeno(- n 1)))))))

我戴上帽子,喝茶,上班没时间做。 你知道现在几点了。

[不带密码审查帽]

首先,如果您正确缩进了代码,它将显示为

(define (zeno n)
    (if (= n 0)
        (+ 0)
        (else
         ((+ (/ 1 (expt 2 n)))
          ((zeno (- n 1)))))))

if in Scheme不像C语言一样的if / then / else构造。 实际上是三元运算符 换句话说,在这种情况下, else毫无意义。

(define (zeno n)
    (if (= n 0)
        (+ 0)
        ((+ (/ 1 (expt 2 n)))
         ((zeno (- n 1)))))))

您不需要使用+来返回数字; 数字是自我评估的。

(define (zeno n)
    (if (= n 0)
        0
        ((+ (/ 1 (expt 2 n)))
         ((zeno (- n 1)))))))

当您具有(foo bar baz)这样的表达式时,通常表示

“使用参数barbaz调用函数foo

您不能随便添加多余的括号。 这些改变了表达的含义。 例如, ((foo) (bar baz))意思是

“不带参数调用函数foo ,并以带参数baz调用bar的结果来调用其结果”

换一种说法,

...
((+ (/ 1 (expt 2 n)))
 ((zeno (- n 1))))))

您在说什么,几乎可以肯定不是在这里,这是

“调用函数(+ (/ 1 (expt 2 n)))的结果是调用不带参数的参数(- n 1)调用zeno的结果。”

你似乎的意思是

“将调用zeno的结果加1除以2^n ,且n小于n

这意味着您应该说的是

(define (zeno n)
    (if (= n 0)
        0
        (+ (/ 1 (expt 2 n))
           (zeno (- n 1)))))

你有几个语法错误(错误的括号内,多),并且if形式不使用else -不要误会我的意思,它确实有一个“其他”的一部分,它只是你不能明确写入else的它起作用。 我相信这就是您的目标:

(define (zeno n)
  (if (= n 0)
      0
      (+ (/ 1 (expt 2 n))
         (zeno (- n 1)))))

对于完全不同的方法,这使用显式的do循环进行求和。 它避免使用expt (通过设计)。

(define (zeno n)
  (do ((n n (- n 1))
       (sum 0 (+ sum frac))
       (frac 1/2 (/ frac 2)))
      ((zero? n) sum)))

将其写入等效的名为let形式时,它可能会或可能不可读:

(define (zeno n)
  (let loop ((n n)
             (sum 0)
             (frac 1/2))
    (if (zero? n)
        sum
        (loop (- n 1) (+ sum frac) (/ frac 2)))))

对于更完全不同的方法,可以使用SRFI 41流:

(define zeno
  (let ((frac-stream (stream-iterate (cut / <> 2) 1/2)))
    (lambda (n)
      (stream-fold + 0 (stream-take n frac-stream)))))

(以上代码段也需要SRFI 26被加载,除了SRFI 41)


甚至更完全不同的方法:仅使用封闭形式的解决方案! (谢谢,WorBlux。)

(define (zeno n)
  (- 1 (/ (expt 2 n))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM