Пример A-7. Последовательности Коллаца (Collatz)

Пример A-7. Последовательности Коллаца (Collatz)

#!/bin/bash

# collatz.sh

# Широко известная последовательность Коллаца (Collatz) (гипотеза Коллаца).

# -------------------------------------------

# 1) Принимает из командной строки "начальное" целое число.

# 2) ЧИСЛО <--- НАЧАЛЬНОЕ ЗНАЧЕНИЕ

# 3) Вывести ЧИСЛО.

# 4) Если ЧИСЛО четное, разделить на 2,

# 5)+ Если не четное -- умножить на 3 и прибавить 1.

# 6) ЧИСЛО <--- РЕЗУЛЬТАТ

# 7) Повторить, начиная с п. 3, заданное число раз.

#

# Теоретически, такая последовательность должна сходиться,

#+ не зависимо от величины начального значения,

#+ к повторению циклов "4,2,1...",

#+ даже после значительных флуктуаций в самом начале.

MAX_ITERATIONS=200

# Для больших начальных значений (>32000), это значение придется увеличить.

h=${1:-$$} # Начальное значение

# если из командной строки ничего не задано, то берется $PID,

echo

echo "C($h) --- $MAX_ITERATIONS итераций"

echo

for ((i=1; i<=MAX_ITERATIONS; i++))

do

echo -n "$h "

# ^^^^^

# табуляция

let "remainder = h % 2"

if [ "$remainder" -eq 0 ] # Четное?

then

let "h /= 2" # Разделить на 2.

else

let "h = h*3 + 1" # Умножить на 3 и прибавить 1.

fi

COLUMNS=10 # Выводить по 10 значений в строке.

let "line_break = i % $COLUMNS"

if [ "$line_break" -eq 0 ]

then

echo

fi

done

echo

exit 0