Towersof Hanoi Bash
Transcript of Towersof Hanoi Bash
Advanced Bash-Scripting Guide: Prev Chapter 23. Functions Next
23.3. Recursion Without Local VariablesA function may recursively call itself even without use of local variables.
Example 23-14. The Towers of Hanoi
#! /bin/bash## The Towers Of Hanoi# Bash script# Copyright (C) 2000 Amit Singh. All Rights Reserved.# http://hanoi.kernelthread.com## Last tested under bash version 2.05b.0(13)-release## Used in "Advanced Bash Scripting Guide"#+ with permission of script author.# Slightly modified and commented by ABS author.
#=================================================================## The Tower of Hanoi is a mathematical puzzle attributed to#+ Edouard Lucas, a nineteenth-century French mathematician.## There are three vertical posts set in a base.# The first post has a set of annular rings stacked on it.# These rings are flat disks with a hole drilled out of the center,#+ so they can slip over the posts.# The rings have different diameters, and they stack in descending#+ order, according to size.# The smallest ring is on top, and the largest on the bottom.## The task is to transfer the stack of rings#+ to one of the other posts.# You can move only one ring at a time to another post.# You are permitted to move rings back to the original post.# You may place a smaller ring atop a larger one,#+ but *not* vice versa.# Again, it is forbidden to place a larger ring atop a smaller one.## For a small number of rings, only a few moves are required.#+ For each additional ring,#+ the required number of moves approximately doubles,#+ and the "strategy" becomes increasingly complicated.## For more information, see http://hanoi.kernelthread.com.### ... ... ...# | | | | | |
# _|_|_ | | | |# |_____| | | | |# |_______| | | | |# |_________| | | | |# |___________| | | | |# | | | | | |# .--------------------------------------------------------------.# |**************************************************************|# #1 #2 #3##=================================================================#
E_NOPARAM=66 # No parameter passed to script.E_BADPARAM=67 # Illegal number of disks passed to script.Moves= # Global variable holding number of moves. # Modifications to original script.
dohanoi() { # Recursive function. case $1 in 0) ;; *) dohanoi "$(($1-1))" $2 $4 $3 echo move $2 "-->" $3
let "Moves += 1" # Modification to original script. dohanoi "$(($1-1))" $4 $3 $2 ;; esac}
case $# in1) case $(($1>0)) in # Must have at least one disk. 1) dohanoi $1 1 3 2 echo "Total moves = $Moves" exit 0; ;; *) echo "$0: illegal value for number of disks"; exit $E_BADPARAM; ;; esac ;;*) echo "usage: $0 N" echo " Where \"N\" is the number of disks." exit $E_NOPARAM; ;;esac
# Exercises:# ---------# 1) Would commands beyond this point ever be executed?# Why not? (Easy)
# 2) Explain the workings of the workings of the "dohanoi" function.# (Difficult)
Prev Home NextLocal Variables Up Aliases