将对子插入堆中的方案

时间:2017-10-31 23:46:58

标签: recursion data-structures scheme heap

这是家庭作业的一部分,我似乎无法弄清楚。我想知道是否有人能指出我正确的方向?

问题是:

  

(insert-list-of-pairs vw-pair-list heap)计算插入产生的   从列表vw-pair-list到堆heap的所有 - 权重对。

以前的功能是在作业中创建的,用于此问题:

(define (create-heap vw-pair left right)
    (list vw-pair left right))

(define (h-min heap)
    (car heap))

(define (left heap)
    (cadr heap))

(define (right heap)
    (caddr heap))

在上一个问题中,我能够使用以下代码成功地将一对添加到堆中:

(define (insert vw-pair heap)
    (if (null? heap)
        (create-heap vw-pair '() '())
        (if (< (weight vw-pair) (weight (h-min heap)))
            (create-heap vw-pair (right heap) (insert (h-min heap) (left heap)))
            (create-heap (h-min heap) (right heap) (insert vw-pair (left heap))))))

我尝试使用以下代码实现类似的过程但没有成功:

(define (insert-list-of-pairs vw-pair-list heap)
    (if (null? vw-pair-list)
        heap
        (if (< (car vw-pair-list) (h-min heap))
            (create-heap (car vw-pair-list) (right heap) 
                          (insert-list-of-pairs (cdr vw-pair-list) heap))
            (create-heap (h-min heap) (right heap) 
                          (insert-list-of-pairs vw-pair-list heap)))))

非常感谢任何和所有帮助!

1 个答案:

答案 0 :(得分:2)

您之前的问题是定义insert的原因很充分 您现在不仅知道如何实现insert,而且还有一个可用于插入的功能,因此您永远不需要再次实现它。

因为什么是这样的对的列表?

如果它不是空的,则是一对,然后是对的列表 而且你已经有了一个将一对插入堆中的函数。

如果只有一个函数将一对列表插入堆中,您可以使用它将列表的其余部分插入堆中,然后将insert列表的第一个元素插入到中< / em>堆,然后你会完成。

但是 - 尤里卡! - 您正在编写的“将一对列表插入堆中”功能 所以,你递言:

(define (insert-list-of-pairs vw-pair-list heap)
    (if (null? vw-pair-list)
        heap
        (insert (car vw-pair-list)
                (insert-list-of-pairs (cdr vw-pair-list) heap))))

然后你就完成了。