【问题标题】:all sized n sublists in SchemeScheme中所有大小的n个子列表
【发布时间】:2019-08-07 02:21:10
【问题描述】:

我是 Scheme 语言的新手,我正在尝试构建一个方法,该方法将列表和数字“n”作为参数并返回所有大小为 n 的子列表。

例如,如果方法接收到'(a b c d)2,它将返回'('(a b) '(b c) '(c d))

方法必须是递归的。

我已经设法获得了第一个大小的 n 列表,但从那里卡住了。

提前致谢。

(define sub-lists
  (lambda (lst n)
    (if (zero?  n)
        '()
        (cons (car los) (sub-lists (cdr lst) (- n 1))))))

【问题讨论】:

    标签: list recursion functional-programming scheme sublist


    【解决方案1】:

    这是一种使用appendmap 的方法-

    (define (choose n l)
      (cond ((zero? n)
             (list null))
            ((null? l)
             null)
            (else
             (append (map (lambda (comb)
                            (cons (car l) comb))
                          (choose (- n 1)
                                  (cdr l)))
                     (choose n
                             (cdr l))))))
    

    它为任何自然n 提供有效结果,包括零 -

    (choose 3 '(a b c))
    ;; '((a b c))
    
    (choose 2 '(a b c))
    ;; '((a b) (a c) (b c))
    
    (choose 1 '(a b c))
    ;; '((a) (b) (c))
    
    (choose 0 '(a b c))
    ;; '(())
    

    n 也超过l 的大小时,它会提供有效结果 -

    (choose 4 '(a b c))
    ;; '()
    

    appendmap 的可能实现 -

    (define (append a b)
      (if (null? a)
          b
          (cons (car a)
                (append (cdr a)
                        b))))
    
    (define (map f l)
      (if (null? l)
          null
          (cons (f (car l))
                (map f
                     (cdr l)))))
    

    如果你希望元素重复,你只需要改变一个表达式 -

    (define (choose n l)
      (cond ((zero? n)
             (list null))
            ((null? l)
             null)
            (else
             (append (map (lambda (comb)
                            (cons (car l) comb))
                          (choose (- n 1)
                                  l)) ;; change (cdr l) to l
                     (choose n
                             (cdr l))))))
    

    组合现在包含重复的元素 -

    (choose 3 '(a b c))
    ;; '((a a a) (a a b) (a a c) (a b b) (a b c) (a c c) (b b b) (b b c) (b c c) (c c c))
    
    (choose 2 '(a b c))
    ;; '((a a) (a b) (a c) (b b) (b c) (c c))
    
    (choose 1 '(a b c))
    ;; '((a) (b) (c))
    
    (choose 0 '(a b c))
    ;; '(())
    

    请注意n 超过l 的场景中的显着差异-

    (choose 4 '(a b c))
    ;; '((a a a a)
    ;;   (a a a b)
    ;;   (a a a c)
    ;;   (a a b b)
    ;;   (a a b c)
    ;;   (a a c c)
    ;;   (a b b b)
    ;;   (a b b c)
    ;;   (a b c c)
    ;;   (a c c c)
    ;;   (b b b b)
    ;;   (b b b c)
    ;;   (b b c c)
    ;;   (b c c c)
    ;;   (c c c c))
    

    【讨论】:

    • 首先非常感谢您的详细解答!第二,这不是我要问的。对于 (a b c) 和 2,结果应该是 '('(a b) '(b c) '(c d))。
    • 输入为'(a b c)时怎么会有'd(choose 2 '(a b c d)) 的答案是 '((a b) (a c) (a d) (b c) (b d) (c d)),由该程序生成。我是否忽略了其他事情?
    • 参见。 this entry 用于另一种 lisp-y 语言,包括。 @dfeuer 的answer 在这段时间之后我仍然需要解决这个问题.... :) 显然这是一个流行的问题,那里有很多链接条目(从传递的角度来说)。 ----显然这里的OP意味着不同的东西,只是\n -> foldr (zipWith (:)) (repeat []) . take n . iterate tailpopularproblem本身就是一个......)。
    猜你喜欢
    • 2021-03-16
    • 2013-02-21
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多