2015-06-28 190 views
0

我有一個關於遞歸函數繪製圖像的問題帶摺疊功能和附加功能?

是的,這是一個家庭作業,但我不知道如何繪製該圖像。我至今是:

  • ,給我點(X/Y)的列表,從曲線的函數((list (x1/y2) (x2/y2)...(xn/yn)
  • 要獲得例如x座標我必須寫point-x (first lis)
  • 函數我叫(zipWith f xs ys)接受兩個列表(xs ys)應用功能f,使一個列表(例如(zipWith + (list 1 2 3) (list 10 20 30)) -> (list 11 22 33)
  • 函數make-tuple取兩個列表和使它們的元組(例如:
    (make-tuple (list 1 2 3) (list 4 5 6)) -> (tuple (list 1 2 3) (list 4 5 6))
    爲了得到第一個元組我必須寫(xs1 (tuple (list 1 2 3) (list 4 5 6)) -> (list 1 2 3)

我們實際的功能:

我們不得不使用它繪製一條線從一點到另一點的功能add-line
參數是image number number number number string
換句話說:empty-image x1 y1 x2 y2 "black"
因此,它與empty-image開始,並吸引了來自(x1/y1)(x2/y2)線與色"black"

而且我們必須使用fold寫的功能。所以,我對這樣的嘗試:

;Signature 
(: render ((list-of point) -> image)) 

(define render 
    (lambda (xs) 
    (let((tuple-list (zipWith make-tuple xs (rest xs)))) 
     (fold empty-image 
      add-line 
      tuple-list)))) 

我試圖做的是採取點的名單,並列出與點
(list (tuple (x1/y1) (x2/y2)) (tuple (x2/y2) (x3/y3))...(tuple (xn/yn) (xn/yn)))
現在我想用fold申請add-line於元組列表的元組。所以我說,讓我們拿第一個元組(我的兩個點)並將它們應用到函數add-line。然後取下一個元組,並將這些點應用於add-line函數(依此類推),直到列表爲空。

現在的問題是,Scheme說add-line需要6個參數,但只能找到2個。我知道我的問題,因爲add-line不知道從哪裏得到其他參數。所以,我想:

(define render 
    (lambda (xs) 
    (let((tuple-list (zipWith make-tuple xs (rest xs)))) 
     (fold empty-image (add-line 
         empty-image 
         (point-x (xs1 (first tuple-list))) 
         (point-y (xs1 (first tuple-list))) 
         (point-x (xs2 (first tuple-list))) 
         (point-y (xs2 (first tuple-list))) 
         "black") 
      tuple-list)))) 

,並知道它說:「函數調用:預計開括號後的函數,但是接收的圖像」

我又知道我的錯誤,add-line畫一條線,並摺疊嘗試將該圖像應用於列表,但需要一個函數而不是圖像。所以我的問題:

我如何寫一個遞歸函數renderadd-linefold,繪製的第一線,然後得到下一個點,並繪製下一行與第一個組合?
(如遞歸add-line功能,即畫線後,再次調用自身)

回答

0

你不說具體情況,你正在使用, 的語言,但是這看起來可疑:

(fold empty-image (add-line ...)) 

在球拍方式使用fold是:

(foldl f base l) 

這裏f是一個函數。在你的代碼中你有empty-image

您需要定義定義一個函數說f,使用一個元組添加一行到「當前」的形象:

; f : tuple image -> image 
(define (f t img) 
    (add-line img 
       (point-x (xs1 t)) 
       (point-y (xs1 t)) 
       (point-x (xs2 t)) 
       (point-y (xs2 t)) 
       "black")) 

然後

(foldl f empty-image tuple-list) 

你可能需要調整一個或兩個讓它工作的東西。