我試圖弄清楚為什么我會收到預期的錯誤向量?和預期的一對?以及是否有辦法將向量作為變數并訪問用于桿切割問題的向量(類似于背包問題)。
#lang slideshow
; test input: (cutrod 5 #(0 1 2 3 2 2 6 1 2 3 10))
(define (square) (colorize(rectangle 20 15) "red"))
(define (rodpiece n) (apply hc-append(vector->list (make-vector n (square)))))
(define (cutrod n s)
(rodpiece n)
(cond
((null? s) '())
(else
(let
([cut (car (vector->list s))]
[rods (cdr (vector->list s))])
(cons cut (cutrod (- n (vector-ref s n)) rods))
(cutrod n rods)
n))))
這是我用來轉換的 C PrintSolution 版本:
void PrintSolution(int n, int s[]){
while(n>0){
printf(“%d ”, s[n]);
n = n ‐ s[n];
}
}
當我嘗試將向量轉換為串列時會發生此錯誤,它說它需要一個向量:

當我保持向量不變時會發生此錯誤,它說它需要一對:

uj5u.com熱心網友回復:
部分問題是(rodpiece)回傳一個串列,而不是一個向量。您可以通過將其更改為:
(define (rodpiece n)
(make-vector 1
(apply hc-append
(build-list n
(lambda (x)
(square))))))
沒有必要從向量開始,但目標是回傳一個。
下一個問題是您(rodpiece)在一個基本上丟棄回傳值的位置呼叫。你想要更接近這個的東西:
(define (cutrod n s)
(let* ((sn (vector-ref s n))
(rp (rodpiece sn)))
它預先確定了桿件的尺寸,然后在不久之后獲取當前的桿件以供使用。然后,您需要檢查遞回的基本情況:
(if (or (<= n 0)
(> n (vector-length s)))
rp
如果 ifn為零或比剩余的 vector 長s,則只需回傳當前的桿件。
遞回本身將當前桿件與剩余桿件累加:
(vector-append rp (cutrod (- n sn) s)))))
把這一切放在一起,你有:
#lang slideshow
(define (square)
(colorize (rectangle 20 20) "red"))
(define (rodpiece n)
(make-vector 1
(apply hc-append
(build-list n
(lambda (x)
(square))))))
(define (cutrod n s)
(let* ((sn (vector-ref s n))
(rp (rodpiece sn)))
(if (or (<= n 0)
(> n (vector-length s)))
rp
(vector-append rp (cutrod (- n sn) s)))))
(define cut-vector #(0 1 2 3 2 2 6 1 2 3 10))
(cutrod 5 cut-vector)
(cutrod 6 cut-vector)
(cutrod 7 cut-vector)
(cutrod 9 cut-vector)
(cutrod 10 cut-vector)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442123.html
上一篇:求和為n的最小完美平方數
