Перейти к основному содержанию
Рецепты Linux

Main navigation

  • Основы
  • Система
  • Команды
  • Программы
  • Дистро
  • Интерфейсы
  • Устройства
  • Доки
User account menu
  • Войти

Строка навигации

  1. Главная
  2. ABS Guide
  3. Часть 4. Материал повышенной сложности
  4. Глава 22. Функции

22.3. Рекурсия без локальных переменных

Функции допускают выполнять рекурсивный вызов даже без использования локальных переменных.

Пример 22-13. Ханойские Башни

#! /bin/bash
#
# Ханойские Башни
# Bash script
# Copyright (C) 2000 Amit Singh. All Rights Reserved.
# http://hanoi.kernelthread.com
#
# Тестировался под bash 2.05b.0(13)-release
#
# Используется в "Advanced Bash Scripting Guide"
#+ с разрешения автора.
# С небольшими изменениями, внесенными автором документа.

#=================================================================#
# Ханойские Башни -- это древняя математическая головоломка.
# Дается три вертикальных стержня.
# На первый нанизан набор колец.
# Эти кольца представляют собой плоские диски с дыркой по-середине,
#+ так что они могут свободно скользить по стержню.
# Кольца имеют различный диаметр, и изначально расположены на первом стержне
#+ в порядке убывания их диаметров.
# Наименьшее кольцо расположено сверху, наиболшее -- внизу.
#
# Суть задачи заключается в том, чтобы перенести кольца с первого
#+ стержня на последний так, чтобы порядок следования колец не изменился.
# Кольца можно перемещать со стержня на стержень только по одному за раз.
# Можно помещать кольца обратно на тот же самый стержень.
# При перемещении нельзя класть больший диск на меньший.
#
# Для небольшого количества колец требутся некоторое количество перемещений.
#+ Каждое дополнительное кольцо
#+ увеличивает необходимое количество перемещений примерно в два раза,
#+ при этом "стратегия" перемещения усложняется все больше и больше.
#
# За дополнительной информацией обращайтесь на http://hanoi.kernelthread.com.
#
#
# ... ... ...
# | | | | | |
# _|_|_ | | | |
# |_____| | | | |
# |_______| | | | |
# |_________| | | | |
# |___________| | | | |
# | | | | | |
# .--------------------------------------------------------------.
# |**************************************************************|
# #1 #2 #3
#
#=================================================================#


E_NOPARAM=66 # Сценарий запущен без параметров.
E_BADPARAM=67 # Неверное число колец.
Moves= # Глобальная переменная, хранит число перемещений.
 # Добавлено в оригинальный сценарий.
	 
dohanoi() { # Рекурсивная функция.
 case $1 in
 0)
 ;;
 *)
 dohanoi "$(($1-1))" $2 $4 $3
 echo move $2 "-->" $3
 let "Moves += 1" # Добавлено в оригинальный сценарий.
 dohanoi "$(($1-1))" $4 $3 $2
 ;;
 esac
}
										 
case $# in
1)
 case $(($1>0)) in # Как минимум должен быть хотя бы один диск.
 1)
 dohanoi $1 1 3 2
 echo "Всего перемещений = $Moves"
 exit 0;
 ;;
 *)
 echo "$0: Неверное число колец";
 exit $E_BADPARAM;
 ;;
 esac
 ;;
*)
 echo "Порядок использования: $0 N"
 echo " Где \"N\" -- это число колец."
 exit $E_NOPARAM;
 ;;
esac
																						
# Упражнения:
# ---------
# 1) Будут ли исполнены дополнительные команды, если разместить их ниже этой строки?
# Почему нет? (Это так просто!)
# 2) Объясните -- как работает функция "dohanoi".
# (А вот это уже сложнее)

Перекрёстные ссылки книги для 22.3. Рекурсия без локальных переменных

  • 22.2. Локальные переменные
  • Вверх
  • Глава 23. Псевдонимы

Book navigation

  • Содержание
  • Часть 1. Введение
  • Часть 2. Основы
  • Часть 3. Углубленный материал
  • Часть 4. Материал повышенной сложности
    • Глава 18. Регулярные выражения
    • Глава 19. Подоболочки, или Subshells
    • Глава 20. Ограниченный режим командной оболочки
    • Глава 21. Подстановка процессов
    • Глава 22. Функции
      • 22.1. Сложные функции и сложности с функциями
      • 22.2. Локальные переменные
      • 22.3. Рекурсия без локальных переменных
    • Глава 23. Псевдонимы
    • Глава 24. Списки команд
    • Глава 25. Массивы
    • Глава 26. Файлы
    • Глава 27. /dev и /proc
    • Глава 28. /dev/zero и /dev/null
    • Глава 29. Отладка сценариев
    • Глава 30. Необязательные параметры (ключи)
    • Глава 31. Широко распространенные ошибки
    • Глава 32. Стиль программирования
    • Глава 33. Разное
    • Глава 34. Bash, версия 2
  • Глава 35. Замечания и дополнения
  • Библиография
  • Приложение A. Дополнительные примеры сценариев
  • Приложение B. Справочная информация
  • Приложение C. Маленький учебник по Sed и Awk
  • Приложение D. Коды завершения, имеющие предопределенный смысл
  • Приложение E. Подробное введение в операции ввода-вывода и перенаправление ввода-вывода
  • Приложение F. Системные каталоги
  • Приложение G. Локализация
  • Приложение H. История команд
  • Приложение I. Пример файла .bashrc
  • Приложение J. Преобразование пакетных (*.bat) файлов DOS в сценарии командной оболочки
  • Приложение K. Упражнения
  • Приложение L. Хронология
  • Приложение M. Авторские права

Последние материалы

  • Приложение scanimage
    23 hours ago
  • Утилита sensors
    4 days 22 hours ago
  • Сканер Rkhunter
    1 week 5 days ago
  • Программа resize2fs
    2 weeks 3 days ago
  • Аудиопроигрыватель QMMP
    3 weeks 2 days ago
RSS feed

Secondary menu

  • О проекте

© 2008–2025 Олег Меньшенин mensh@yandex.ru