2013-10-06 3 views
0

Я пытаюсь изучить Haskell, и я застрял в проблеме с рекурсией. То, что мне нужно сделать, это найти, что число простое или нет. Это моя попытка. Но это не работает. Он дает «False» для не простых чисел, но он застревает в бесконечном цикле, когда число является простым.Haskell: детекторы числа простых чисел

isPrime :: Int -> Bool 
isPrime num = primeTest num 2 
    where 
     primeTest :: Int -> Int -> Bool 
     primeTest num x 
      | x == num  = True 
      | num `mod` x == 0 = False 
      | otherwise = primeTest num (x + 1) 
       where 
       x = 2 

ответ

3

Вам не нужно

where 
    x = 2 

Вот почему он работает в бесконечном цикле. Например, рассмотрим ввод 2, num mod x вернет 0, поэтому он вернет False. Рассмотрите ввод 5, num mod x вернется 1 (с x в этом случае 1). Таким образом, он переходит в другую часть, где вызывается primeTest num (x + 1) с назначением x = 2. Таким образом, всегда этот цикл будет выполняться бесконечно, с x значения 3.

+0

Большое вам спасибо. Я страдал от головной боли, пытаясь понять, что было не так, когда было ясно. Я действительно высоко ценю это! –

+1

@ user2850788 Добро пожаловать. Пожалуйста, подумайте над тем, чтобы ответить и принять этот ответ, если он вам поможет. http://meta.stackexchange.com/a/5235/235416 – thefourtheye

1

where x=2 в конце вызывает каждый экземпляр x после primeTest num x быть 2, независимо от значения, переданного primeTest в «слоте x. " Избавьтесь от where x=2.

Смежные вопросы