40、(converse (converse expt)) 和 expt 是同一个过程吗?请说明理由。
是的, (converse (converse expt)) 和 expt 是同一个过程。 converse 过程会交换传入过程的前两个参数顺序,对 expt 使用一次 converse 会得到一个“反向”版本的 expt ,即先接收指数作为第一个参数,再接收底数作为第二个参数。若再对这个“反向”版本的 expt 使用一次 converse ,参数顺序会再次交换,从而恢复为原始的 expt 过程。
41、定义一个适配器 >rotate,它可以接收三个或更多参数,并将它们作为单独的结果返回,但要把第一个参数作为第三个结果,第二个参数作为第一个结果,第三个参数作为第二个结果。例如,调用‘(>rotate 1 2 3 4 5)’应按顺序返回值 2、3、1、4 和 5。
以下是一个可能的实现:
(define (>rotate arg1 arg2 arg3 . rest)
(values arg2 arg3 arg1 ,@rest))
这个定义中,适配器接收三个参数 arg1 、 arg2 、 arg3 ,以及可能存在的更多参数 rest 。它返回的结果中, arg2 作为第一个结果, arg3 作为第二个结果, arg1 作为第三个结果,而 rest 中的参数按原顺序跟在后面。
42、定义一个适配器 >duplicate ,它接收一个参数并将该参数作为两个独立的值返回。使用这个适配器,为 square 过程提出一个替代定义。
适配器 >duplicate 可定义为:
(define (>duplicate arg) (values arg arg))
对于 square 过程,可借助 * 和 >duplicate 来实现替代定义,即:
(define square (pipe >duplicate *))
43、定义一个过程 next-power-of-ten ,该过程接受一个自然数作为参数,并返回一个最小的 10 的整数次幂且该数大于给定的自然数。例如, (next-power-of-ten 954) 的值是 1000, (next-power-of-ten 10000) 的值是 100000。另外,根据此规范, (next-power-of-ten 0) 的值是 1。
以下是使用 Scheme 语言实现 next-power-of-ten 过程的代码:
(define (next-power-of-ten num)
(let loop ((power 1))
(if (> (expt 10 power) num)
(expt 10 power)
(loop (+ power 1)))))
这段代码定义了一个内部循环过程 loop ,从 10 的 1 次幂开始,不断增加幂次,直到找到一个 10 的幂大于给定的自然数,然后返回这个幂。
44、解释 power-of-two? 谓词的前置条件。如果在调用此过程时提供 0 作为参数会发生什么?如果提供一个负整数会发生什么?为什么?
`power-of-two?` 谓词的前置条件是参数必须为正整数。若提供 `0` 作为参数,程序会陷入错误,因为 `0` 持续除以 `2` 不会达到 `1` 或其他奇数,不能满足终止条件。若提供负整数,同样会陷入错误,因为负整数持续除以 `2` 也不会达到 `1` 或其他奇数,无法满足终止条件。
45、一个自然数的横向和是其二进制表示中1的个数(或者等价地,是其二进制表示中各位数值的和)。例如,53的二进制表示是‘110101’,所以53的横向和是4。定义一个一元过程sideways - sum,它接受任意自然数作为参数,并通过反复将给定的数除以2并统计奇数结果的数量来返回其横向和。
以下是用Scheme语言实现的 sideways-sum 过程:
(define (sideways-sum num)
(define (helper n count)
(if (= n 0)
count
(helper (halve n) (+ count (if (odd? n) 1 0)))))
(helper num 0))
此过程定义了一个内部辅助过程 helper ,它接受当前数字和已统计的1的数量作为参数。在每次递归调用中,若当前数字为0则返回已统计的1的数量;否则,将当前数字除以2,并在当前数字为奇数时将统计数量加1。
46、不使用计算机,用欧几里得算法计算1152和1280的最大公约数。
首先,用较大数除以较小数,即1280除以1152:
$$ 1280 = 1 \times 1152 + 128 $$
此时余数不为0,继续用1152除以128:
$$ 1152 = 9 \times 128 + 0 $$
当余数为0时,除数128就是1152和1280的最大公约数。
所以,1152和1280的最大

最低0.47元/天 解锁文章
1619

被折叠的 条评论
为什么被折叠?



