61、一个数字列表的交替和是这样计算的:从初始元素加到 0 开始,交替进行加法和减法运算得到最终结果。例如,列表 (list 7 2 4 6 1) 的交替和是 7 - 2 + 4 - 6 + 1,结果为 4。空列表的交替和是 0。定义一个名为 alternating - sum 的过程,该过程接收任意数字列表并返回其交替和。(提示:考虑如何递归地定义交替和。)
可以使用递归的方式定义 alternating-sum 过程。当列表为空时,交替和为 0;当列表不为空时,先取出列表的第一个元素,然后对剩余列表递归调用 alternating-sum 过程,并根据位置决定是加还是减这个递归结果。
以下是具体的 Scheme 代码实现:
(define (alternating-sum ls)
(define (helper ls add?)
(if (empty-list? ls)
0
(if add?
(+ (first ls) (helper (rest ls) #f))
(- (first ls) (helper (rest ls) #t)))))
(helper ls #t))
62、设计并实现一个可变参数的最大公约数(gcd)过程,该过程用于找出能整除其所有参数(必须为正整数)的最大自然数。(Scheme 提供了一个原生过程来实现此功能,但在本题中不能使用该原生过程)
可以利用欧几里得算法来实现可变参数的最大公约数过程。欧几里得算法基于这样的原理:两个正整数 m 和 n 的最大公约数等于 n 和 m 除以 n 的余数的最大公约数。对于可变参数的情况,可以先定义两个数的最大公约数函数,然后依次对参数列表中的数执行最大公约数计算。
以下是实现代码示例:
(define (divisible-by? n d)
(zero? (modulo n d)))
(define (gcd-two m n)
(if (zero? n)
m
(gcd-two n (modulo m n))))
(define (gcd-variable-arity . args)
(if (null? args)
0
(let loop ((result (car args))
(rest (cdr args)))
(if (null? rest)
result
(loop (gcd-two result (car rest))
(cdr rest))))))
上述代码中, divisible-by? 函数用于判断一个数是否能被另一个数整除; gcd-two 函数使用递归方式实现了两个数的最大公约数计算; gcd-variable-arity 函数通过 loop 辅助函数依次对参数列表中的数进行最大公约数计算,最终返回所有参数的最大公约数。
63、定义一个名为 multidiv 的过程,它可以接收一个或多个参数,每个参数都必须是整数,除第一个参数外其他参数都必须非零。该过程使用数论除法依次将第一个参数除以其他参数并舍弃余数。例如,调用 ‘(multidiv 360 5 3 2)’ 的值为 12,因为 360 除以 5 得 72,72 除以 3 得 24,24 除以 2 得 12。又如,调用 ‘(multidiv 17016 7 11 13 17)’ 的值为 0,即连续数论除法的最后一个商。如果 multidiv 只接收一个参数,则应返回该参数本身。
以下是实现 multidiv 过程的代码:
(define (multidiv first . rest)
(if (null? rest)
first
(let loop ((result first) (divisors rest))
(if (null? divisors)
result
(loop (quotient result (car divisors)) (cdr divisors))))))
这段代码定义了 multidiv 过程,它接收一个或多个参数。如果只有一个参数,直接返回该参数;如果有多个参数,使用循环依次将第一个参数除以其他参数,最终返回最后一个商。
64、定义一个名为 double - divisors 的过程,它接受两个参数:第一个是正整数列表,第二个是自然数。该过程返回给定列表中那些其平方能整除给定自然数的元素组成的列表。例如,调用‘(double - divisors (list 2 5 8 11 14 17 20) 3628800)’的结果是 (list 2 5 8 20),因为 2、5、8 和 20 的平方(即 4、25、64 和 400)是 3628800 的因数,而 11、14 和 17 的平方不是。
以下是使用 Scheme 语言实现 double-divisors 过程的代码:
(define (double-divisors lst num)
(filter (lambda (x) (zero? (modulo num (* x x)))) lst))

最低0.47元/天 解锁文章
1019

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



