这个Scheme计划中的错误在哪里?

时间:2013-04-20 01:23:59

标签: scheme

我收到了“错误:lambda无效:( lambda(insert-all))。”

(define permutations
 (lambda (L)
  (let
   ((insert-all
    (lambda (e Ls)
     (let
     ((insert-one
      (lambda (L)
       (letrec
        ((helper
         (lambda(L R)
         (if (null? R)
          (list (append L(list e)R))
          (helper (append L (list (car R) ) ) (cdr R) )
          ))))
          (helper '() L)))))
          (apply append(map insert-one Ls)))))))

  (cond ((null? L) '() )
  ((null?(cdr L)) (list L))
  (else (insert-all (car L) (permutations ((cdr L))))))))

应该返回给定列表的所有排列。

1 个答案:

答案 0 :(得分:1)

您在无效方案中提供的表单。具体来说,您的最高级let表单没有正文。您可能认为cond子句是正文,但由于您的括号,它不是let的一部分。老实说,这是格式化的错误。这是一个'正确'格式化的Scheme表单:

(define (permutations L)
  (let ((insert-all
         (lambda (e Ls)
           (let ((insert-one
                  (lambda (L)
                    (let helper ((L '()) (R L))
                      (if (null? R)
                          (list (append L (list e) R))
                          (helper (append L (list (car R)))
                                  (cdr R)))))))
             (apply append (map insert-one Ls))))))

    (cond ((null? L)       '())
          ((null? (cdr L)) (list L))
          (else (insert-all (car L)
                            (permutations (cdr L)))))))

至少它编译并运行,虽然它没有产生正确答案(虽然我不知道它输入的是什么):

> (permutations '(a b c))
((c b a))
> (permutations '((a b) (1 2)))
(((1 2) (a b)))

这是一个有效的实现:

(define (permutations L)
  (define (insert-all e Ls)
    (apply append 
           (map (lambda (e) 
                  (map (lambda (x) (cons e x)) Ls))
                e)))
  (cond ((null? L)       '())
        ((null? (cdr L)) (map list (car L)))
        (else (insert-all (car L)
                          (permutations (cdr L))))))


> (permutations '((a b) (1 2) (x y)))
((a 1 x) (a 1 y) (a 2 x) (a 2 y) (b 1 x) (b 1 y) (b 2 x) (b 2 y))

你的代码的基本结构很好;只是缺少insert-onehelper的实施。