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

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

  1. #!/bin/bash
  2. # collatz.sh
  3. #  Широко известная последовательность Коллаца (Collatz) (гипотеза Коллаца).
  4. #  -------------------------------------------
  5. #  1) Принимает из командной строки "начальное" целое число.
  6. #  2) ЧИСЛО <--- НАЧАЛЬНОЕ ЗНАЧЕНИЕ
  7. #  3) Вывести ЧИСЛО.
  8. #  4)  Если ЧИСЛО четное, разделить на 2,
  9. #  5)+ Если не четное — умножить на 3 и прибавить 1.
  10. #  6) ЧИСЛО <--- РЕЗУЛЬТАТ
  11. #  7) Повторить, начиная с п. 3, заданное число раз.
  12. #
  13. #  Теоретически, такая последовательность должна сходиться,
  14. #+ не зависимо от величины начального значения,
  15. #+ к повторению циклов "4,2,1...",
  16. #+ даже после значительных флуктуаций в самом начале.
  17. MAX_ITERATIONS=200
  18. # Для больших начальных значений (>32000), это значение придется увеличить.
  19. h=${1:-$$}                      #  Начальное значение
  20.                                 #  если из командной строки ничего не задано, то берется $PID,
  21. echo
  22. echo "C($h) --- $MAX_ITERATIONS итераций"
  23. echo
  24. for ((i=1; i<=MAX_ITERATIONS; i++))
  25. do
  26. echo -n "$h     "
  27. #          ^^^^^
  28. #           табуляция
  29.   let "remainder = h % 2"
  30.   if [ "$remainder" -eq 0 ]   # Четное?
  31.   then
  32.     let "h /= 2"              # Разделить на 2.
  33.   else
  34.     let "h = h*3 + 1"         # Умножить на 3 и прибавить 1.
  35.   fi
  36. COLUMNS=10                    # Выводить по 10 значений в строке.
  37. let "line_break = i % $COLUMNS"
  38. if [ "$line_break" -eq 0 ]
  39. then
  40.   echo
  41. fi
  42. done
  43. echo
  44. exit 0