2012-02-20 84 views
1

我正在寫一個斐波那契數列生成器,我不確定應該使用哪種數據類型。這就是我在做的:斐波那契數據類型

  • 生成斐波那契數列中的前1000個數字並將其存儲在集合中。

  • 隨機播放上述系列(即玩弄元素)並將其存儲在新集合中。

  • 通過以下規則轉換上述2個集合來創建一個新的集合 - 新集合中的每個元素將是前兩個集合中各個元素的平均值,它們位於同一個索引中。即newcollection [0] =(original [0] + shuffle [0])/ 2。

我已經決定我的原始收藏和洗牌收藏應該是IEnumerable<long>。平均收集應該是IEnumerable<double>,你認爲這是正確的?我是否應該使用IEnumerable<decimal>進行平均收集?

注意:最終所有集合都刷新到控制檯。

感謝, -Mike

+4

通過Jon Skeet:「對於值爲」自然精確小數「的值,使用小數點很好,這通常適用於人類發明的任何概念:財務價值是最明顯的例子,但也有其他例子。例如,給潛水員或溜冰者的分數。「 http://stackoverflow.com/questions/618535/what-is-the-difference-between-decimal-float-and-double-in-c – SpaceBison 2012-02-20 14:32:00

回答

3

IEnumerable<long>適用於(無限)發生器。

但是,IEnumerable接口不保證對元素進行隨機訪問的恆定(O(1))隨機訪問,這至少對於混洗是必需的。因此,您應該將生成器的結果存儲到IList<long>或簡單的數組中。

編輯:

我做了一些研究,似乎連第100 Fibonacci數不能放入一個長(check Wolfram alpha)。你必須在這裏使用一些big integer數據類型...

+0

它不是一個無限生成器,它只生成斐波那契數列中的前1000個元素。 – Mike 2012-02-20 14:53:13

+0

@Mike,OK,然後直接使用一個List或一個數組。這裏真正的問題是,第1000個斐波納契數是〜4.3x10^209,所以你不得不求助於一些大的數字庫......「long」,「int」,「float」或「decimal」太小了。 – linepogl 2012-02-20 15:02:47

+0

:雙倍的最大值是1.7976931348623157E + 308,第1000個斐波納契數是4.34 * 10^208。那它不應該支持嗎? – Mike 2012-02-20 16:11:50

0

你爲什麼不使用只是標準的陣列? int [1000]和double [1000]?

+0

因爲我想使用LINQ的懶惰評估。應用程序的全部重點是驗證性能。 – Mike 2012-02-20 14:33:08

0

只使用List<int>,因爲斐波那契元素是整數。

+0

他們不是。只有系列的前46個元素可以放入'int'中。 – linepogl 2012-02-20 14:55:31

+0

哦,你是對的。我的錯。 – 2012-02-20 14:58:57