In cammino verso l'unità

In cammino verso l'unità

Dato un numero nn qualunque, sottraetegli 1 se è dispari, mentre dividetelo per 2 se è pari. Quanti passi sono necessari per arrivare a 1?

Per capire meglio il problema prendete come riferimento gli esempietti che seguono.

function show_steps(n::Integer)
    steps = 0
    while n>1
        if n%2 == 0
           n = n÷2
        else
           n = n-1
        end
        steps += 1
        print("→ $n ")
    end
    print("(steps=$steps)")
end

21 (steps=1)
321 (steps=2)
421 (steps=2)
5421 (steps=3)
105421 (steps=4)
20105421 (steps=5)
30151476321 (steps=7)

Tuttavia, simulare questi passaggi (sottrarre 1 o dividere per 2) può diventare dispendioso per numeri molto alti: vorremo quindi trovare un modo che, dato un numero nn, ci dia una risposta più immediata per il numero di passi necessari per arrivare a 1. Esiste quindi una "formula" generale, in funzione di nn, che calcoli direttamente la soluzione?

Soluzione

Last modified: January 05, 2025. Website built with Franklin.jl and the lovely Julia programming language.