У меня есть шляпа, мой чай и нечего делать какое-то время на работе. Вы знаете, в какое время.
[доны code-review шляпа]
Во-первых, если у вас properly indented свой код, он будет читать
(define (zeno n)
(if (= n 0)
(+ 0)
(else
((+ (/ 1 (expt 2 n)))
((zeno (- n 1)))))))
if
на схеме не нравится if
/then
/else
конструкцию C подобных языкам. Это на самом деле ternary operator. Другими словами, 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)
, это обычно означает
"Вызов функции с аргументами foo
bar
и baz
"
Вы не можете просто добавить дополнительные скобки, как вам заблагорассудится; они меняют смысл выражения. Например, ((foo) (bar baz))
означает
«Вызов функции foo
без аргументов, и вызвать его результат с результатом вызова bar
с аргументом baz
»
Другими словами,
...
((+ (/ 1 (expt 2 n)))
((zeno (- n 1))))))
что вы говорите, и почти наверняка это не значит, вот
«Вызвать функцию (+ (/ 1 (expt 2 n)))
с результатом вызова результата вызова zeno
с аргументом (- n 1)
без аргументов."
То, что вы, кажется, имею в виду
„Добавить 1
деленной на 2^n
в результате вызова zeno
с один меньше, чем n
“
Это означает, что то, что вы должны сказать, is
(define (zeno n)
(if (= n 0)
0
(+ (/ 1 (expt 2 n))
(zeno (- n 1)))))
Не работает ли это только из-за ошибки округления FP? –