我如何在计划中实现这一点:
* 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)...)
答案 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 ,具体取决于当前是否为偶数。