将对插入堆的方案
Scheme Inserting Pairs into Heap
这是我似乎无法理解的家庭作业的一部分。我想知道是否有人可以指出正确的方向?
问题如下:
(insert-list-of-pairs vw-pair-list heap)
evaluates to the heap resulting from inserting
all of the value-weight pairs from the list vw-pair-list
into the heap 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)))))
我们将不胜感激任何帮助!
您之前的问题是定义 insert
。
有充分的理由
您现在不仅知道如何实现 insert
,而且您还拥有一个可用于插入的函数,因此您无需再次实现它。
因为这样的对列表是什么?
如果不为空,则为一对后跟一对列表。
并且您已经有一个将一对插入堆中的函数。
如果你有一个将成对列表插入堆的函数,你可以使用它来将列表的其余部分插入堆,然后 insert
将列表的第一个元素插入 that堆,然后就大功告成了。
但是 - 尤里卡! - "insert a list of pairs into a heap" 函数就是您正在编写的函数。
所以,你递归:
(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))))
然后你就完成了。
这是我似乎无法理解的家庭作业的一部分。我想知道是否有人可以指出正确的方向?
问题如下:
(insert-list-of-pairs vw-pair-list heap)
evaluates to the heap resulting from inserting all of the value-weight pairs from the listvw-pair-list
into the heapheap
.
以下函数是早先在作业中创建的,用于解决此问题:
(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)))))
我们将不胜感激任何帮助!
您之前的问题是定义 insert
。
有充分的理由
您现在不仅知道如何实现 insert
,而且您还拥有一个可用于插入的函数,因此您无需再次实现它。
因为这样的对列表是什么?
如果不为空,则为一对后跟一对列表。
并且您已经有一个将一对插入堆中的函数。
如果你有一个将成对列表插入堆的函数,你可以使用它来将列表的其余部分插入堆,然后 insert
将列表的第一个元素插入 that堆,然后就大功告成了。
但是 - 尤里卡! - "insert a list of pairs into a heap" 函数就是您正在编写的函数。
所以,你递归:
(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))))
然后你就完成了。