2009-10-23 2 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] 

하지만 n가 회문하지 않을 때입니다 n시 이전 반복의 목록으로 xs를 정의하는 방법을 모르겠어요. 어떻게하면 좋을까요? 둘째로이 방법이 효과가 있습니까?

+2

'True'와 쓸모없는 부울 비교. 기억해 보면,'something == True' ='something'; 'something == false' =='not something'. 사람들이 * 어떤 언어로 이것을 할 때 나는 그것을 싫어한다. – ephemient

답변

3

관심사를 별개의 단계로 구분하면 훨씬 쉽게 될 수 있습니다.

  1. 숫자와 그 역의 합을 계산하는 함수를 정의하십시오.
  2. 부터 시작하여 번호를 반복하려면 iterate을 사용하십시오.
  3. 반복을 50 단계로 제한하려면 take을 사용하십시오.
  4. 술어와 함께 all을 사용하여 이러한 단계 중 하나에서 회유가 발생하는지 확인하십시오.
+0

Duh, 당연히 나는 '모든 것'이 아니라 '모든 것'을 의미했습니다. 근본적으로 같은 물건, 그래도. De Morgan의 법칙'''''''p = 또는. map p = 아닙니다. 그리고. 지도 (not. p) = 아닙니다. 모두 (안 .p)' – ephemient

2

당신은 answer에서 호출 [] 시작하여 otherwise 경우 재귀 호출에에 추가 lychrel에 매개 변수로 반복의 목록 (또는 반복 만 수)를 통과해야합니다. 이 기법에 대한보다 일반적인 배경에 대해서는 "누적 매개 변수"를 참조하십시오.

관련 문제