Ответ в теме: Составить список из цифр заданного числа в обратном порядке

      Комментарии к записи Ответ в теме: Составить список из цифр заданного числа в обратном порядке отключены
#1958

Алгоритм разложения числа на цифры заключается в последовательности шагов, каждый из которых:

  1. отделяет последнюю цифру числа за счет получения остатка от деления на 10;
  2. отбрасывает последнюю цифру числа (получает новое число) при помощи целочисленного деления на 10;
  3. рекурсивно обрабатывает число до тех пор, пока оно не равно нулю.

positive_number_to_list(0, []):-!.
positive_number_to_list(Number, [Digit|Tail]):-
  Digit is Number mod 10,
  NextNumber is Number div 10,
  positive_number_to_list(NextNumber, Tail).

Приведенная функция корректно обработает любые целые положительные числа, в том числе, заканчивающиеся на ноль. Однако, если на вход будет подан ноль — функция вернет пустой список — это не корректно. Кроме того, функция не сработает для отрицательных чисел, т.к. например -22 mod 10 равно 8, а не 2. Самый простой способ решить эти проблемы — написать вспомогательную функцию, которая корректно обработает частные случаи — для нуля вернет список из одного элемента, а для отрицательного числа обработает модуль:

number_to_list(0, [0]):-!.
number_to_list(Number, List):-
  Number < 0, !, positive_number_to_list(-Number, List);
  positive_number_to_list(Number, List).