scheme - 如何将指数应用于球拍中的内置列表
问题描述
所以我知道如何使用 build-list 在球拍中建立一个列表
例如:
(build-list 2 add1) => (list 1 2)
但是,如果我想将指数应用于列表,它以某个数字结尾,我将如何去做。
例如:指数 3,它将从 0 开始并在 3 结束,将其应用于构建列表中的 1 和 2。
1^0 * 1^1 * 1^2 * 1^3
2^0 * 2^1 * 2^2 * 2^3
大概是我所拥有的。
(define (list-of-numbers m n)
(apply * (build-list (get m) (lambda (n) (expt n n)))))
(define (get m)
(build-list m add1))
输出应该是:
(list-of-numbers 2 3) ⇒ (list 1 64)
1 × 1 × 1 × 1 = 1
1 × 2 × 4 × 8 = 64
解决方案
使用的解决方案build-list
可以从构建m
元素列表开始:
(build-list m add1)
在这里,(build-list 2 add1)
-->(1 2)
接下来,可以再次使用map
列表build-list
来构造列表列表。我们将需要一个应用到列表的过程,例如(1 2)
,它将从每个元素构造一个列表。请注意,每个元素都应转换为n+1
元素列表(在list-of-numbers 2 3
我们有的情况下n == 3
):
(lambda (x) (build-list (add1 n) some-procedure))
当此过程应用于来自 的元素时(1 2)
,我们应该得到一个类似(1 1 1 1)
, 或的列表(1 2 4 8)
。为此,some-procedure
将调用范围内的一个数字[0, n]
。需要some-procedure
做的是从第一个列表(x
在上面的lambda
表达式中)中取出它的数字,并从第二个列表(范围内的数字)中将它提升到它的数字的幂[0, n]
。所以,现在可以写成some-procedure
:
(lambda (y) (expt x y))
这里,x
取自第一个lambda
表达式,y
取自[0, n]
提供的范围build-list
。现在我们需要在我们构建的第一个列表上使用map
这个复合lambda
表达式:
(map (lambda (x) (build-list (add1 n) (lambda (y) (expt x y))))
(build-list m add1))
如果我们分别用 2 和 3 的输入来测试上述映射的结果m
和n
,我们会得到:
'((1 1 1 1) (1 2 4 8))
剩下的就是apply
乘以这里的子列表;同样,我们可以在每个子列表上使用map
一个lambda
表达式,apply
为我们留下一个结果列表:
(define (list-of-numbers m n)
(map (lambda (s) (apply * s))
(map (lambda (x) (build-list (add1 n) (lambda (y) (expt x y))))
(build-list m add1))))
这是一些示例输出:
scratch.rkt> (list-of-numbers 2 3)
'(1 64)
scratch.rkt> (list-of-numbers 3 3)
'(1 64 729)
scratch.rkt> (list-of-numbers 3 2)
'(1 8 27)
有什么可以代替应用的吗?
apply
可以map
再次使用,而不是使用,使用与乘法一起lambda
应用于子列表的表达式:foldl
(define (list-of-numbers-2 m n)
(map (lambda (x) (foldl * 1 x))
(map (lambda (x) (build-list (add1 n) (lambda (y) (expt x y))))
(build-list m add1))))
工作方式与以前相同:
scratch.rkt> (list-of-numbers-2 2 3)
'(1 64)
scratch.rkt> (list-of-numbers-2 3 3)
'(1 64 729)
scratch.rkt> (list-of-numbers-2 3 2)
'(1 8 27)
推荐阅读
- arrays - Vue 数组和循环问题
- javascript - 将所有相对路径替换为绝对路径,并使用正则表达式忽略已经是绝对路径
- javascript - Jquery:获取索引小于当前单击星的星
- python - 如何在 PyCharm 中进行智能评论?
- swagger - 禁用默认响应按摩 SpringDoc Open API 3
- reactjs - 即使 Image uri 在本机反应中为真,为什么每次调用都会出现 onError ?
- charts - 更改 PhpWord 图表中的字体样式
- mysql - 在 Laravel 中存储 32 位二进制文件的正确方法
- javascript - 角度选择和的 NaN 总值
- java - 使用@Slf4j 注解创建时如何模拟 Logger?