recursion - 如何在方案中使用 foldr 编写解压缩?
问题描述
这是unzip
在 Scheme 中编码的函数的代码
(define (unzip lst)
(define (firsts lst)
(if (null? lst)
'()
(cons (caar lst)
(firsts (cdr lst)))))
(define (seconds lst)
(if (null? lst)
'()
(cons (cdar lst)
(seconds (cdr lst)))))
(list (firsts lst) (seconds lst)))
会给我们这样的输出:
(unzip '((1 . 2) (3 . 4) (5 . 6))) => '((1 3 5) (2 4 6))'
但我很好奇如何unzip
使用 Schemefoldr
函数实现相同的功能,任何人都可以帮忙吗?真的提前谢谢了。
解决方案
由于您使用了racket
标签,我将使用 给出答案,它的语法比orfor/fold
好得多。1foldr
foldl
for 的语法for/fold
大致是:
(for/fold <accumulators>
<iterators>
<body>)
我们可以使用两个累加器ret1
并ret2
存储两个列表中的每一个,然后将它们放在累加器#:result
形式中:
([ret1 '()]
[ret2 '()]
#:result (list (reverse ret1) (reverse ret2)))
迭代器相当简单:
([i (in-list lst)])
最后,body 只需要拆分每一对,并将其附加到累加器中:
(values (cons (car i) ret1)
(cons (cdr i) ret2))
所以把它们放在一起给出:
(define (unzip lst)
(for/fold ([ret1 '()]
[ret2 '()]
#:result (list (reverse ret1) (reverse ret2)))
([i (in-list lst)])
(values (cons (car i) ret1)
(cons (cdr i) ret2))))
正如预期的那样:
> (unzip '((1 . 2) (3 . 4) (5 . 6)))
'((1 3 5) (2 4 6))
1至少在我看来,这些事情总是有点主观。
推荐阅读
- java - JDBC 没有从我的本地数据库中提取数据
- swift - 为什么 indexPath 和 IndexPath 都不被接受?
- mysql - 如何使用nodejs将我的数据中的学校名称等特定数据显示到控制台?
- julia - 调用函数的工作人员不打印
- facebook - 从拥有的广告帐户中获取广告系列
- java - 通过 ObjectOutputStream 的 writeObject 方法进行的 Java ArrayList 序列化不起作用
- html - 模态对话框的Ionic 3边框半径在android中不起作用
- shell - 通过java运行shell脚本时找不到转换命令
- javascript - React-native- 如果数组为空,则有条件地禁用 TouchableHighlight
- php - MySQL 夏令时信息似乎不正确。如何确保它在 Windows 中是最新的?