(displayln "Programma per la Congettura di Collatz")
(displayln "-----------------------------------------")
; --- Definizione della funzione Collatz ---
; (Questa funzione è identica a prima)
(define (collatz n)
(displayln "Inizio della sequenza:")
(let loop ([current n])
(displayln current)
(cond
[(= current 1)
(displayln "Sequenza completata.")]
[(even? current)
(loop (/ current 2))]
[(odd? current)
(loop (+ (* 3 current) 1))]
)))
; --- Esecuzione principale (con input validato) ---
; Usiamo un 'let loop' per chiedere l'input
; finché non è un intero positivo.
(define start-number
(let loop () ; Loop senza parametri di partenza
(displayln "Inserisci un numero intero positivo (es. 7):")
(define input (read)) ; Legge l'input a ogni ciclo
; Controlla se l'input è valido
(if (and (integer? input) (> input 0))
input ; SE VALIDO: restituisce l'input.
; Questo valore esce dal loop e viene assegnato a 'start-number'.
(begin ; SE NON VALIDO:
(displayln "Errore: L'input deve essere un numero intero positivo. Riprova.")
(loop))))) ; Richiama il loop per chiedere di nuovo.
; A questo punto, siamo sicuri che 'start-number' contenga un numero valido.
; Avviamo la funzione Collatz.
(collatz start-number)