Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 使用抽象列表函数的列表的Powerset_Scheme_Racket_Fold_Powerset - Fatal编程技术网

Scheme 使用抽象列表函数的列表的Powerset

Scheme 使用抽象列表函数的列表的Powerset,scheme,racket,fold,powerset,Scheme,Racket,Fold,Powerset,是否可以使用racket函数返回给定列表的功率集 约束- 没有显式递归 使用抽象列表函数 代码包含在两行中(实际要求) 例如: (动力装置(12)) ((12)(1)(2)() 以任何顺序 我发现的另一个仍然使用显式递归 我的工作流程: 以(powerset'(abc))为例 首先得到一个整数列表,最大为(expt 2(长度列表));'(01 2 3 4 5 6 7) 将它们转换为各自的二进制形式2->(0,1,0)。所以我们得到了”((0,0,0,0,1),(0,1,0),(0,1,1)

是否可以使用racket函数返回给定列表的功率集


约束-

  • 没有显式递归
  • 使用抽象列表函数
  • 代码包含在两行中(实际要求)

  • 例如:
    (动力装置(12))

    ((12)(1)(2)()

    以任何顺序

    我发现的另一个仍然使用显式递归


    我的工作流程:

  • (powerset'(abc))
    为例
  • 首先得到一个整数列表,最大为
    (expt 2(长度列表));'(01 2 3 4 5 6 7)
  • 将它们转换为各自的二进制形式
    2->(0,1,0)
    。所以我们得到了
    ”((0,0,0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1))
  • 将“(1 2 3)映射到二进制文件列表。例如:
    2->'(0,1,0)->'((0,a)(1,b)(0,c))
  • 使用lambda过滤结果列表,这样我们就可以将元素保留为1,比如
    '((1,b))
  • 提取动力集

  • 我的方法有问题

    它不遵循问题在一行中的约束(函数标题之外)


    在我的作业中,这个问题是一个额外的问题,但我没能做到

  • 什么是抽象列表函数
    • foldl
      foldr
      map
  • 我的奖金包括三个子部分
    • 第1部分要求以我想要的任何方式简单地实现这个函数。所以我用递归来实现
    • 第二部分是我提出问题的部分。这一条特别困难,因为代码的附加约束是在两行以内
    • 第三部分应该是最难的
    不要编写任何辅助函数, 并且不要使用任何显式递归(即,您的函数不能通过名称调用自己)。不要使用任何抽象列表函数。事实上,只使用以下球拍函数、常数和特殊形式列表:
    cons
    first
    rest
    empty?
    empty
    lambda
    cond


    然而,有趣的是,我研究了Y-combinator,并且能够解决这个问题(经过6小时的编码)。

    回答您的奖金第2部分:

    (define (pws l) 
      (foldr (lambda (e a) (append (map (lambda (x) (cons e x)) a) a)) '(()) l))
    
    两行,每行少于80个字符,为
    定义保留的第一行(因此,一行)

    如果不允许
    append
    ,则我们将
    append。。。将
    组合映射为一个
    文件夹

    (define (pws-fr l) 
      (foldr (lambda (e a)
               (foldr (lambda (x r)
                        (cons (cons e x) r))
                      a a))
             '(()) l))
    
    或者缩短,

    (define (pws-fr-1 l) 
      (foldr (lambda (e a) (foldr (lambda (x r) (cons (cons e x) r)) a a)) '(()) l))
    
    (define (pws-am-fr1 l) (foldr (lambda (e a)
       (foldr (lambda (x r) (cons x (cons (cons e x) r))) '() a)) '(()) l))
    
    (第二行正好有80个字符)

    另一种编码方法是基于
    append map
    的代码(第二个代码段),当仅使用
    foldr
    重新编码时,该代码段将变为

    (define (pws-am-fr l) 
      (foldr (lambda (e a)
               (foldr (lambda (x r)
                        (cons x (cons (cons e x) r)))
                      '() a))
             '(()) l))
    
    或缩短

    (define (pws-fr-1 l) 
      (foldr (lambda (e a) (foldr (lambda (x r) (cons (cons e x) r)) a a)) '(()) l))
    
    (define (pws-am-fr1 l) (foldr (lambda (e a)
       (foldr (lambda (x r) (cons x (cons (cons e x) r))) '() a)) '(()) l))
    

    可能完全满足您的要求,也可能不完全满足您的要求。

    您之前的问题以重复的形式结束。不要简单地删除它,然后以相同的方式重新询问它。相反,阅读另一个问题及其答案;也许他们解决了你的问题。如果没有,请编辑第一个问题,同时明确问题的不同之处-关闭的问题可以在编辑时重新打开。@amalloy否!我在前面的问题中也做了编辑!但它仍然关闭。问题是使用递归很容易做到。我已经完成了第一部分。我添加了约束部分,它清楚地说明了-不使用显式递归(这在您提出的问题中被违反)。谢谢。@amalloy现在明白了吗?@ÓscarLópez我知道它包含一个答案,但它使用递归。再次指出这一点之前,请检查上面的注释。是的,是作业,我在帖子里提到过。最后期限过去了,所以这都不重要,但我很好奇怎么能做到。也许我提到的方法是正确的?2行的要求并不愚蠢。在这篇文章中,我提到一行中有80个字符的限制。请仔细阅读后再指出!我会问我的教授谢谢你抽出时间回答:
    (define(pws l)
    (foldr(lambda(ea)(append(map(lambda(x)(cons e x))a))”(())l))