Вывод количества вызовов рекурсивной функции
Задача такова: у меня есть функция, которая принимает на вход число, мне нужно разбить это число (если оно имеет больше 1 символа) на цифры и перемножить все эти цифры. Данное действие должно повторяться пока аргумент функции не станет одноразрядным числом. Ну и вывести мне нужно количество повторений этого алгоритма. То есть к примеру если функция принимает на вход 39 то нужно вывести 3, так как 3*9 = 27, 2*7 = 14, 1*4=4. Если принимает на вход 999 то 4, так как 9*9*9 = 729, 7*2*9 = 126,1*2*6 = 12,1*2 = 2 и тд. Для этой задачи я написал рекурсивный алгоритм. Вот и он:
static int count;
public static int Persistence(long n)
{
count++;
int position = 0;
int[] array = n.ToString().Select(x => (int)Char.GetNumericValue(x)).ToArray(); //здесь я разделяю число на цифры
if (n > 10)
return Persistence(array[position] * array[position + 1]);
return count;
}
public static void Main()
{
Console.WriteLine(Persistence(4));
}
Моя проблема такова: алгоритм правильно работает только с двухразрядными числами, но вот если разрядов в числе больше, то алгоритм работает только с первыми двумя цифрами данного числа. Пример: если я введу число 999, то программа умножит первые две цифры, в итоге получится, что n = 81, мне же нужно чтобы все три девятки в этом числе перемножились и число n стало равно 729. Заранее спасибо за помощь.
Ответы (1 шт):
Ну, собственно, вы и написали перемножение только 2х цифр здесь:
return Persistence(array[position] * array[position + 1]);
Перемножить все:
var mul = array[0];
for (int i = 1; i < array.Length; ++t)
mul *= array[i];
return Persistence(mul);
ну, или тоже самое с помощью Linq:
var mul = array.Aggregate((a, b) => a * b);
return Persistence(mul);