2016-08-08 33 views
2

我試圖在屏幕上繪製一些東西。Haskell:接收一個列表並迭代幾次

我的函數接收一個int參數列表(例如[0,0,0,5,5,5,3,3,3,2,4,4,0]),我必須迭代從最大數([0,0,0,5,5,5,3,3,3,2,4,4,0]) - > 5)直到0的幾次,直到0

在每次迭代I檢查整個列表,並生成一個字符串(連接「」,「 - 」和「\ n」)。編寫結果是假設是這樣的:

*** 
    *** ** 
    ****** ** 
    ********* 
    ********* 
------------- 

我的功能是:

generateSTR (x:xs) = daux (x:xs) (maximum (x:xs)) (x:xs) "" 
    where daux (h:hs) mh (y:ys) strdib 
      | mh /= 0 && length(h:hs) == 0  = daux (y:ys) (mh-1) (y:ys) "\n" ++ strdib 
      | mh > h && mh > 0 && (h:hs) /= [] = daux hs mh (y:ys) "" ++ strdib 
      | mh <= h && mh > 0 && (h:hs) /= [] = daux hs mh (y:ys) "*" ++ strdib 
      | mh == 0 && length(h:hs) > 0   = daux hs mh hs "-" ++ strdib 
     daux [] 0 [] strdib = strdib 
     daux [] _ _ strdib = strdib 

的問題是,我只得到了第一線的平局(b是空白「 「)。

bbb***bbbbbbb 

第一行是確定的,但我不知道爲什麼我的程序停止。當我試圖恢復原始列表(函數中的第三個參數)時,肯定我做錯了什麼。

第三個參數是想「拯救」的原始列表和消耗整個列表之後,連接一個「\ n」,並恢復原來的列表,下一次迭代繼續下去,直到0

我」什麼米做錯了嗎?

預先感謝您。

+2

它不清楚(至少對我來說)你如何處理列表,我的意思是什麼關係列表,最大數量和輸出? – Netwave

+1

是的,我也不清楚你的意圖。你能舉幾個輸入和期望輸出的例子嗎? – luqui

+0

注意'length(h:hs)== 0'永遠不會是真的,並且'(h:hs)/ = []'總是爲真。 「長度(h:hs)> 0」相同。 – ErikR

回答

4

當你的代碼變得如此毛茸茸以致於無法調試時,最好退後一步並嘗試新的方法來解決問題。優選地,構建較小的可測試組件。

在這種情況下,您正嘗試生成一個垂直條形圖,並給出一個高度列表。正如你發現的,這樣做是。但是我們可以很容易地生成一個單槓,對吧?這只是n重複的*字符。

bar :: Int -> String 
bar n = replicate n '*' 

-- bar 5 = "*****" 

下一個棘手的問題是旋轉它,使它垂直。那看起來像是一個Haskell值?我們將有一個String s的列表,而不是簡單的String,它們每個代表一行。所以如果我們有[replicate n '*']作爲長度爲n的單行,我們想要的是replicate n ['*'],或者n行的長度爲1.我們可以直接使用該定義,但事實證明這個操作只是轉置一個由函數提供的矩陣Data.List.transpose

verticalBar :: Int -> [String] 
verticalBar n = transpose [bar n] 

-- verticalBar 5 = ["*","*","*","*","*"] 

這應該指出我們如何將水平條形列表變成垂直圖形。

transpose . map bar 

但是這不是很正確,因爲我們失去了一些元素,圖形看起來是顛倒的!我們需要填充每一行,以便在我們移位之前,我們的橫向佈局圖不會變得不齊整。

graph :: [Int] -> String 
graph heights = unlines . transpose . map draw $ heights 
    where 
    maxHeight = maximum heights 
    draw height = replicate (maxHeight - height) ' ' ++ replicate height '*' ++ "-" 

現在我們有我們的圖!

λ putStrLn $ graph [0,0,0,5,5,5,3,3,3,2,4,4,0] 
    *** 
    *** ** 
    ****** ** 
    ********* 
    ********* 
------------- 
+0

完美的解釋。謝謝! – JPrado