операция перекрестного суммирования в Хаскеле - PullRequest
0 голосов
/ 27 апреля 2018

Мне нужно определить рекурсивную функцию crosssum :: Int -> Int в Haskell, чтобы вычислить перекрестную сумму положительных чисел. Мне не разрешено использовать какие-либо функции из иерархической библиотеки, кроме (:), (>), (++), (<), (> =), (<=), div, mod, not (&&), max мин и т. д. </p>

crosssum :: Int -> Int 
cross sum x = if x > 0 
          then x `mod` 10 
          + x `div` 10 + crosssum x 
          else 0 

поэтому, когда я заполняю, например в перекрестной сумме 12 написано «поток убит» Я не понимаю, как это сделать правильно. Буду признателен за любые идеи. Thx

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

divMod в Prelude также очень удобен. Это одна операция как для div, так и для mod, фактически для всех двухзначных чисел dm n = sum.sequence [fst,snd] $ divMod n 10

cs 0 = 0;   cs n =  m+ cs d   where (d,m) = divMod n 10 

cs сделает номер любого размера.

0 голосов
/ 27 апреля 2018

Одна из проблем с вашим кодом заключается в том, что x не уменьшается (или не изменяется каким-либо образом), когда оно передается в качестве аргумента рекурсивного вызова crosssum. Вот почему ваша программа никогда не останавливается.

Модифицированный код:

crosssum :: Int -> Int
crosssum x = if x > 0
             then x `mod` 10 + crosssum (x `div` 10)
             else 0

будет иметь следующую логику

crosssum 12 = 2 + (crosssum 1) = 2 + (1 + (crosssum 0)) = 2 + 1 + 0

Кстати, Haskell поможет вам избежать условия if, используя сопоставление с образцом, чтобы получить более читаемый код:

crosssum :: Int -> Int
crosssum 0 = 0
crosssum x =
  (mod x 10) + (crosssum (div x 10))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...