簡體   English   中英

在 Haskell 中計算玫瑰樹的大小

[英]Compute size of rose tree in Haskell

對於 uni 的練習,我必須使用 Haskell 中的玫瑰樹,定義如下:

data Rose a = MkRose a [Rose a]

其中一個練習是編寫 function size:: Rose a -> Int返回給定樹的節點數。 我為這個練習找到的解決方案(也在 StackOverflow “https://stackoverflow.com/questions/56060053/write-a-function-that-counts-the-number-of-elements-in-a-rosetree”)是以下:

size (MkRose _ []) = 1
size (MkRose a (t:ts)) = roseSize t + roseSize (MkRose a ts)

但我真的不明白為什么這是正確的。 假設您有以下玫瑰樹: 在此處輸入圖像描述

是不是算錯了節點數。 您從節點 1 開始,其中t = MkRose 2 [MkRose 1 (t:ts)]ts = MkRose 3 [] 現在MkRose 1 ts的大小是 2。 t的大小也是 2。 當顯然有 3 個節點時,給出最終答案 4。 有誰知道我錯在哪里? 提前致謝!!

不,它不會為您描述的樹給出錯誤的答案* - 實際上,它根本沒有給出答案。 讓我們定義

t = Rose 2 [Rose 1 [t, Rose 3 []]]

然后計算:

size t
= { unroll defn. of t }
size (Rose 2 [Rose 1 [t, Rose 3 []]])
= { defn. of size, case 2 }
size (Rose 1 [t, Rose 3 []]) + size (Rose 2 [])
= { defn. of size, case 2 }
size t + size (Rose 1 [Rose 3 []]) + size (Rose 2 [])

但是這個第一個加數, size t ,正是我們開始計算的東西,所以我們進入了一個循環。 並將無休止地擴大到越來越大的數額。

*你描述的樹和你畫的圖不代表同一個東西。 雖然上面定義的t將存儲在 memory 中,就像您在使用 GHC 時繪制的圖(可能是最理智的實現),但它的含義是一個看起來像這樣的無限樹:

2 --> 1 --> 2 --> 1 --> 2 --> 1 --> 2 --> 1 --> 2 --> ...
      |           |           |           |
      v           v           v           v
      3           3           3           3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM