【发布时间】:2015-04-29 11:53:46
【问题描述】:
如果不使用球拍内置的展平功能,如何展平列表?
我明白flatten的默认实现是
(define (flatten lst)
(cond
((null? list)
empty)
((list? (car lst))
(append (flatten (car lst)) (flatten (cdr lst))))
(else
(cons (car lst) (flatten (cdr lst))))))
但我不完全确定如何不使用 flatten 功能,因为我不知道它在幕后是如何工作的。除了这段代码的实现之外,我找不到很好的解释。谁能解释一下
这是我非常糟糕的尝试,我几乎一无所知,因为它甚至没有关闭并且不会运行....
(define acc null)
(define (my-flatten lst)
(cond
[(null? lst) null]
[(list? (car lst)) (help-flatten (car lst)) (append (cdr lst) acc)]
[else (append (car lst) acc) (my-flatten (cdr lst))]))
(define (help-flatten subLst)
(if (null? subLst)
(set! acc null)
(append (car subLst) acc))
(help-flatten (cdr subLst)))
【问题讨论】:
-
什么意思?第一个
flatten函数不使用Racket 的flatten函数,它递归地调用自己。该实现几乎是独立的,但不正确 - 请参阅我的答案。另外,尽量避免使用变异操作 (set!),这不是我们在 Scheme 中编写大多数函数的方式。
标签: scheme racket flatten list-processing