Если у вас есть проблема, которую необходимо решить с помощью рекурсии, вам, вероятно, не следует использовать for
-loops. Цель состоит в том, чтобы каждая итерация fill()
заполняла одну ди git в правильной позиции в массиве и при необходимости снова вызывала себя, чтобы заполнить оставшиеся цифры. У вас уже есть правильная структура в вашем коде, но она неэффективна из-за дополнительных for
-l oop. Вы можете избежать этого, используя возвращаемое значение fill()
, чтобы отслеживать, где вы должны разместить цифры. Вот возможное решение:
int fill(long long number, int arr[10])
{
if (!number)
return 0;
int pos = fill(number / 10, arr);
arr[pos] = number % 10;
return pos + 1;
}
В этой реализации мы будем называть себя рекурсивно, пока число не станет равным нулю. Когда он равен нулю, мы возвращаем 0. Возвращаемое значение используется, чтобы указать, где в массиве мы должны написать di git. Поэтому после того, как мы достигнем самого глубокого уровня рекурсии и вернемся в первый раз, мы записываем наиболее значимые ди git в arr[0]
. Тогда мы вернемся 0 + 1
. Это означает, что на один уровень рекурсии вверх у нас есть pos = 1
, и мы записываем второй по значимости di git в arr[1]
, а затем мы возвращаем 1 + 1
и так далее, пока не напишем наименее значимый di git и тогда мы закончили. Возвращаемое значение начального вызова fill()
тогда равно количеству цифр, записанных в arr
.
Есть еще две проблемы с этой функцией. Первый - когда number
больше 10 цифр. В этом случае он будет писать после конца массива. Таким образом, вам нужно добавить некоторую проверку, чтобы предотвратить это, или убедиться, что массив достаточно большой, чтобы содержать максимально возможное значение long long
(что составляет 20 цифр, если long long
- 64-бит). Проверьте LLONG_MAX
из заголовка climits.h , чтобы получить максимальное значение для вашей платформы. Во-вторых, эта функция не очень хорошо обрабатывает отрицательные числа. Если вы хотите, чтобы он обрабатывал только неотрицательные числа, измените его на unsigned long long
. В этом случае имейте в виду, что наибольшее число - ULLONG_MAX
, а на 64-битных платформах это, вероятно, означает 21 цифру.