2009-10-23 72 views
1

我正在做Lychrel數字Project Euler question 55,其目的是在50次迭代中找到10,000以下的Lychrel數量。我想出了這個:Haskell中的中間列表

revAdd n = (read $ reverse $ show n) + n 

lychrel n | length xs == 50 = error "False" 
      | ((reverse $ show (revAdd n)) == (show (revAdd n))) = True 
      | otherwise = (lychrel (revadd n)) : xs 

answer = length [ x | x <- [1..10000] , lychrel x == True] 

但我不知道如何定義xs如先前迭代時n名單,這是當n不是迴文。我將如何做到這一點,其次,這將工作?

+2

與'True'無用的布爾比較。記住,'something == True' ='something'; '東西==假'=='不是東西'。當人們用* any *語言來做這件事時,我討厭它。 – ephemient 2009-10-23 16:12:45

回答

3

如果將您的疑慮分爲不同的步驟,則變得更加容易。

  1. 定義一個將數字與其相反的和相加的函數。
  2. 使用iterate重複您的號碼,從x開始。
  3. 使用take將迭代次數限制爲50步。
  4. 使用帶謂詞的all來確定這些步驟中的任何一個是否導致迴文。
+0

杜,當然我的意思是「任何」而不是「全部」。基本上同樣的事情,雖然;德摩根定律「任何p =或。地圖p =沒有。和。 map(not。p)= not。所有(不是.p)' – ephemient 2009-10-23 21:01:37

2

你需要作爲一個參數傳遞迭代的列表(或迭代的只是數)lychrel,從answer在通話開始[]並在otherwise情況下,遞歸調用添加到它。查找「積累參數」以獲得有關此技術的更多一般背景信息。