【问题标题】:Scheme, recursion with list of lists方案,带有列表列表的递归
【发布时间】:2011-12-10 22:17:17
【问题描述】:

我的程序有点问题。这个过程需要一个列表列表,虽然他的长度大于 1,但应用一个减去 2 个列表并做差异的过程。它的结果是集合子集的问题。 示例我需要什么:

args=('(1)'(1)'(3))

length != 1 -> 过程 (if(null?(minus '(1) '(1))))

-> 递归(子(cdr args))

args=('(1) '(3))

length !=1 -> 过程 (if(null?(minus '(1) '(3)))) -

#f 结束。

但是我的程序我不知道是什么然后返回#t...

(define sub
  (lambda args
    (if(= (length args) 1) #t
       (if(null? ( minus (list-ref args 0) (list-ref args 1)))
          (sub (cdr args))
          #f))))

已修复:)

(define subsethood
  (lambda args

    (sub args)
    ))

(define (sub args)

    (if(= (length args) 1) #t
       (if(null? ( minus (list-ref args 0) (list-ref args 1)))
          (sub (cdr args))
          #f)))

【问题讨论】:

  • 设置差异的过程,带2个参数-lists,例如:(a b) (a b c) = () (a b) (a e) = (b)
  • 请发布一些示例输入和输出。目前尚不清楚该程序试图做什么。
  • (sub '(1) '(1) '(2)) #t (sub '(1) '(1)) #t (sub '(2) '(1)) # f 它使用 2 个参数,但是如果我使用递归,因为我想将它用于任意数量的参数,它不起作用。思想主体是一个程序返回#t,当第一个参数是第二个的子集,第二个是第三个的子集等等。过程减去帮助我,因为如果返回()表示第一个列表的列表,如果是 2 个列表的子集,我可以继续递归,减少列表和减号列表可以应用于其他 2 个参数,如果减号的返回不是空列表,我不想继续,我可以说#f
  • 我尝试追踪它> (require (lib "trace.ss")) > (trace sub) > (sub '(1) '(1) '(9999) '(345) '(23132)) >(sub '(1) '(1) '(9999) '(345) '(23132)) >(sub '((1) (9999) (345) (23132))) <#t #t,但我不知道为什么在第一次招募期间停止,因为 '((1) (9999) (345) (23132))) 的长度是 4,没有 1 .
  • Hm with args 而不是 #t return > (sub '(1) '(1) '(9999) '(345) '(23132)) (((1) (9999) (345 ) (23132))),我的列表中做了一些事情,这就是问题

标签: recursion scheme


【解决方案1】:

来自@OndrPem 编辑,只是为了在正确的位置。

(define subsethood
  (lambda args

    (sub args)
    ))

(define (sub args)

    (if(= (length args) 1) #t
       (if(null? ( minus (list-ref args 0) (list-ref args 1)))
          (sub (cdr args))
          #f)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多