- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读了 The perils of Java Schools大约 8 个月前,从那时起,我一直将它用作我应该很快学习的内容的 list 。我明白他所说的大部分内容。
然而,我不太确定这部分:
in a purely functional program, the value of a variable never changes, and yet, it changes all the time! A paradox!
(define (tail-rec n)
(if (= n 1)
(display "Done!")
(begin
(display n)
(newline)
(tail-rec (- n 1)))))
n
的值在尾递归函数中
tail-rec
当您查看正在输出的内容时,它尚未发生变化,您会看到它实际上发生了变化。也因为函数本身没有改变状态
最佳答案
为了回答您的问题,Joel 的文章确实指的是这种情况下的递归。
但是,您的代码实际上并不是纯函数式的,因为 display
和 newline
有副作用。因此,我将切入正题,并为您提供一些纯函数递归代码的具体示例。
考虑一个 greatest common divisor功能:
(define (gcd x y)
(if (zero? y)
x
(gcd y (modulo x y))))
x
来自
y
非零,它(尾)递归调用
gcd
再次,在这个新电话中,
x
和
y
值(value)观不同。 (特别是,
y
值每次迭代都会变小,最终导致基本情况是
x
正好除以
y
,即使
y
必须为 1 才能发生这种情况。)
(define (merge lhs rhs)
(cond ((null? lhs) rhs)
((null? rhs) lhs)
((< (car rhs) (car lhs))
(cons (car rhs) (merge lhs (cdr rhs))))
(else
(cons (car lhs) (merge (cdr lhs) rhs)))))
lhs
的情况时和
rhs
非空,我们递归到另一个调用
merge
,每次调用中其中一个列表较短,我们最终会得到一个基本情况,其中一个列表为空。
(define (mergesort lst)
(let ((len (length lst)))
(if (< len 2)
lst
(let-values (((lhs rhs) (split-at lst (quotient len 2))))
(merge (mergesort lhs) (mergesort rhs))))))
关于recursion - 乔尔·斯波尔斯基 (Joel Spolsky) 在变量值不同时变化的悖论中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18169520/
我读了 The perils of Java Schools大约 8 个月前,从那时起,我一直将它用作我应该很快学习的内容的 list 。我明白他所说的大部分内容。 然而,我不太确定这部分: in a
来自 Joel Spolsky 的 article关于泄漏的抽象: [C]ertain SQL queries are thousands of times slower than other log
我正在阅读热门文章Unicode article from Joel Spolsky还有一张图我看不懂。 “十六进制最小值、十六进制最大值”是什么意思?这些值代表什么?最小值和最大值是多少? 二进制只
我是一名优秀的程序员,十分优秀!