[英]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)
这样的表达式时,通常表示
“使用参数
bar
和baz
调用函数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.