(方案)我如何划分这些清单?

时间:2010-11-19 15:48:27

标签: scheme

我如何在计划中实现这一点:

* INPUT:((1.1)(1.7))

*输出:(((1.2)(1.4)(1.6))((1.3)(1.5)(1.7)))

基本上我有一个包含两个元素的列表。每个元素也是一个包含两个元素的列表,两个元素都是整数> = 0和< 8

我必须创建这个:

input ((a1 . b) (a1 . c)) 

output: (if (and (= a1 a2) (odd? b))
          While < b c
             (list (a1 . b+1) (a1 . b+3) (a1 . b+n)...)) 
             (list (a2 . b) (a2 . b+2) (a2 . b+4)...)

1 个答案:

答案 0 :(得分:0)

“划分列表”

注意:(a . b)不是正确的列表。这是缺点 请参阅下面的不同处理,其中 input 是一个列表,但 left right cons es:

给定输入:((a1 . b) (a2 . c))
左边是:(car input)
权利是:(cadr input)
a1:(car left)
a2:(car right)
b:(cdr left)
c:(cdr right)

生成奇数和偶数对列表:

创建一个启动程序例程(此处称为 Hawaiian ),如上所述拆分输入。在这个例子中,这个启动器将调用一个名为 Hawaii 的递归列表生成器:

;;; ((abscissa0 . start) (abscissa1 . end )) => 
;;;    (Hawaii start end abscissa '() '()) 
;;; When abscissa0 == abscissa1
(define (Hawaiian pairs)
  (let* ((first (car pairs))
     (second (cadr pairs))
     (start (cdr first))
...
(Hawaii start end abscissa0 '() '()))))

正如您所注意到的那样, Hawaii 被调用两个空列表,结果的初始值设定项:奇数和偶数对的列表。

夏威夷例程从完成开始向后计数,开始附加到 evens 的相应列表赔率,具体取决于当前数字是奇数还是甚至。在追加之后,它再次调用自身(使用较低的计数),直到当前计数为开始。

夏威夷的第一行和最后一行:

;;; start end abscissa null null => (list odds evens)
;;; odds  = (list (abscissa . start) ... (abscissa . start+2)  ...)
;;; evens = (list (abscissa . start+1) ... (abscissa . start+3) ...)
(define (Hawaii start current abscissa odds evens)
  ;; Counting backward (start <- current )
  (let((new-el (cons abscissa current)))
    (if (=  current start)
     (list (cons new-el odds) evens)
     (let* ((next...
            (elist...
              ... ))
  (Hawaii start next abscissa olist elist)))))

要完成 Hawaii rountine,请添加三行(每行'...'1):
1.在下一次迭代中计算 next current 的值。
2.计算 olist :如果当前是奇数,那么 olist = new-el + 赔率;否则它只是赔率,再次 3. elist 相同。将new-el附加到 evens 或只是传递 evens ,具体取决于当前是否为偶数。