首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个Scheme程序中的错误在哪里?

这个Scheme程序中的错误在哪里?
EN

Stack Overflow用户
提问于 2013-04-20 09:23:59
回答 1查看 680关注 0票数 0

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

代码语言:javascript
运行
复制
(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))))))))

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

EN

Stack Overflow用户

回答已采纳

发布于 2013-04-20 13:57:13

您提供的表单方案无效。具体地说,最高级别的let表单没有正文。您可能认为cond子句是主体,但由于您的括号,它不是let的一部分。老实说,这是您的格式错误。以下是一个“正确”格式的方案表单:

代码语言:javascript
运行
复制
(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)))))))

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

代码语言:javascript
运行
复制
> (permutations '(a b c))
((c b a))
> (permutations '((a b) (1 2)))
(((1 2) (a b)))

下面是一个有效的实现:

代码语言:javascript
运行
复制
(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的实现。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16115567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档