【发布时间】:2021-10-20 14:28:20
【问题描述】:
我编写了一个函数,它接收一个列表并返回一个包含所有排列的列表。它的工作原理是:
- 单元素列表的排列是其自身的列表。
- n 元素列表的排列是每个元素后跟删除元素后的列表排列。
(define (remove-nth lst n) ; remove the nth element from a list lst
(append (take lst n)
(drop lst (+ 1 n))))
(define (perm lst) ; a list of all permutations of lst
(if (null? (cdr lst))
(list lst)
(apply append (map (lambda (i)
(map (lambda (sublst) (cons (list-ref lst i)
sublst))
(perm (remove-nth lst i))))
(range (length lst))))))
例子:
> (perm '(1 2 3))
'((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))
可以做尾递归吗?
附:我知道 Racket 中有一个permutations 函数。虽然它是尾递归的,但它使用不同的算法。我很好奇我写的那个是否也可以是尾递归的。
【问题讨论】:
-
是的,每个程序都可以写成迭代过程,要么直接写,要么使用自动转换。参见例如 CPS 重写。当前延续是显式的,您可以直接选择接下来要计算的内容,并且可以选择使其成为尾递归。
标签: recursion scheme lisp racket tail-recursion