Друг предложил мне написать программу, которая получает три целых числа (int a, int n, int k)
и вычисляющий как можно более эффективно, a^n mod k
Включить рекурсивную программу для итерационных
Я пришел с этим решением
public static int rec(int a,int n,int k) //calc a^n mod k
{
if(n == 1)
return a % k;
int exp1 = rec(a, n/2, k), exp2 = exp1;
if(n % 2 == 1)
exp2 = rec(a, n/2 + 1, k);
return (exp1 * exp2) % k;
}
Это невероятно простой рекурсивный решение, полагающееся на то, что a^(b+c) mod d = (a^b mod d * a^c mod d) mod d
, и работает в логарифмическом времени. По крайней мере, теоретически.
На практике, когда мы измеряли наше решение, его линейное временное решение было лучше, чем мое решение. Я подозреваю, что это связано с использованием рекурсии, а не циклов. Имеет ли это смысл? Если да - как я могу превратить этот код в итеративную программу?
Рекурсия Java ** медленная **. В Java нет оптимизации хвостовой рекурсии. Избегайте, как чума, если вы хотите производительность. –