Возможно, если вы запустите алгоритм с некоторыми значениями, чтобы увидеть, как рассчитывается результат, он может помочь вам понять, как его преобразовать.Давайте посмотрим один прогон для x=5
, e=5
и m=7
:
1. x=5, e=5, m=7
xsqrm=4
e:odd => res = 5*...%7
2. x=4, e=2, m=7
xsqrm=2
e:even => res = ...%7
3. x=2, e=1, m=7
xsqrm=4
e:odd => res = 2*...%7
4. x=4, e=0, m=7
e==0 => res = 1
res = 5*2%7=3
На шаге 1 мы получаем частичный расчет для результата: это в 5 раз больше результата следующего шага мод7. На шаге 2, поскольку это даже результат, совпадает с результатом следующего шага.На шаге 3 мы получили что-то похожее на шаг 1. Результат, который мы передадим наверх, рассчитывается путем умножения следующего результата на 2 (снова мод 7).И в конце у нас есть наш результат, чтобы подать наверх: 1. Теперь, когда мы идем вверх, мы просто знаем, как вычислить res: 2*1%7
для шага 3, 2
для шага 2 и 2*5%7
дляШаг 1.
Один из способов реализовать это - использовать стек.При каждом частичном результате, если показатель степени нечетен, мы можем поместить коэффициент умножения в стек, а после завершения мы можем просто умножить их все.Это наивный / читерский метод для конвертации.
Есть более эффективный способ, который вы сможете увидеть, если взгляните на шаги выше.Также другие ответы о преобразовании всего в хвостовую рекурсию - очень хороший совет.