Seus dois algoritmos são equivalentes (pelo menos para números inteiros positivos, o que acontece com números inteiros negativos na versão imperativa depende da semântica de Java pela %
qual eu não conheço de cor). Na versão recursiva, deixar e b i ser o argumento do i th chamada recursiva:
um i + 1 = b i b i + 1 = um i m o d b iumaEubEuEu
umai + 1= bEubi + 1= aEum o d bEu
Na versão imperativo, deixa e b ' i ser os valores das variáveis e no início do i th iteração do loop.
a ′ i + 1 = b ′ i b ′ i + 1 = a ′ i m o d b ′ iuma′Eub′Eua
b
Eu
uma′i + 1=b′Eub′i + 1=a′Eum o d b′Eu
Percebe uma semelhança? Sua versão imperativa e sua versão recursiva estão calculando exatamente os mesmos valores. Além disso, ambos final, ao mesmo tempo, quando (resp. De uma ' i = 0 ), de modo que executam o mesmo número de iterações. Então, algoritmicamente falando, não há diferença entre os dois. Qualquer diferença será uma questão de implementação, altamente dependente do compilador, do hardware em que é executado e, possivelmente, do sistema operacional e de quais outros programas estão sendo executados simultaneamente.umaEu= 0uma′Eu= 0
A versão recursiva faz apenas chamadas recursivas de cauda . A maioria dos compiladores para linguagens imperativas não os otimiza e, portanto, é provável que o código que eles gerem gaste um pouco de tempo e memória construindo um quadro de pilha a cada iteração. Com um compilador que otimiza chamadas de cauda (compiladores para linguagens funcionais quase sempre o fazem), o código de máquina gerado pode muito bem ser o mesmo para ambos (supondo que você harmonize essas chamadas para abs
).