Scheme (方案)如何划分这些列表?

Scheme (方案)如何划分这些列表?,scheme,Scheme,我如何在计划中实施此功能: *输入:((1.1)(1.7)) *输出:((1.2)(1.4)(1.6))((1.3)(1.5)(1.7))) 基本上我有一个包含两个元素的列表。每个元素也是一个包含两个元素的列表,两个元素都是整数>=0和

我如何在计划中实施此功能:

*输入:((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)...)
输入((a1.b)(a1.c))
输出:(如果(和(=a1 a2)(奇数?b))
而
“划分列表”

注意:
(a.b)
不是合适的列表。它是一对还是一对。
请参阅下面的不同处理,其中输入是一个列表,但左侧和右侧是cons-es:

给定输入:
((a1.b)(a2.c))

左边是:
(汽车输入)

右边是:
(cadr输入)

a1:
(汽车左侧)

a2:
(汽车右侧)

b:
(cdr左)

c:
(cdr右)

奇偶对列表的生成:

创建一个初学者例程(这里称为Hawaiian),它如上所述分割输入。此启动器将调用递归列表生成器,在本例中称为夏威夷:

;;; ((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 '() '()))))
正如您所注意到的,调用夏威夷时有两个空列表,即结果的初始值设定项:奇偶对列表

夏威夷例行程序从结束到开始向后计数,并根据当前数字是奇数还是偶数添加到适当的偶数列表中。追加后,它再次调用自身(使用较低的计数),直到当前计数为开始

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

;;;开始-结束横坐标null=>(列出偶数)
;;; 赔率=(列表(横坐标开始)…(横坐标开始+2)…)
;;; evens=(列表(横坐标开始+1)…(横坐标开始+3)…)
(定义(夏威夷开始当前横坐标)

;倒数(开始输入和输出之间的关系不是很明显——我想你需要解释一下。这是一个学校项目,我必须创建夏威夷支票谢谢,这非常有用!
;;; 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)))))