numberOf 3 또는 numberOf integer> 2를 호출 할 때 코드가 여기에 있습니다. 오류 - C 스택 오버플로가 발생했습니다. 내 코드는 n> 2에서 이진수로 2^(n-2) (2^n) -1 사이의 숫자를 변경하고 연속 0인지 아닌지를 확인해야합니다. 만약 거기에 카운트가없고 +1이 없다면.내 재귀 함수에서 스택 오버플로
numberOf :: Integer -> Integer
numberOf i = worker i
worker :: Integer -> Integer
worker i
| (abs i) == 0 = 0
| (abs i) == 1 = 2
| (abs i) == 2 = 3
| otherwise = calculat (2^((abs i)-2)) ((2^(abs i))-2)
calculat :: Integer -> Integer -> Integer
calculat ab bis
| ab == bis && (checker(toBin ab)) == True = 1
| ab < bis && (checker(toBin ab)) == True = 1 + (calculat (ab+1) bis)
| otherwise = 0 + (calculat (ab+1) bis)
checker :: [Integer] -> Bool
checker list
| list == [] = True
| 0 == head list && (0 == head(tail list)) = False
| otherwise = checker (tail list)
toBin :: Integer -> [Integer]
toBin n
| n ==0 = [0]
| n ==1 = [1]
| n `mod` 2 == 0 = toBin (n `div` 2) ++ [0]
| otherwise = toBin (n `div` 2) ++ [1]
테스트 :
numberOf 않음 3 : 5 (13)
numberOf 10 (144)
numberOf (-5) (5)
numberOf calculat IN (13)
(+1) 스택 오버 플로우에 대한 :
당신은 또한 당신이 불필요한 혼란을 가지 어려운 방법을 수행하거나 추가 한 많은 장소가 실질적으로 최대 코드를 청소 수 표제. –