Towersof Hanoi Bash

3
Advanced Bash-Scripting Guide: Prev Chapter 23. Functions Next 23.3. Recursion Without Local Variables A 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.

Transcript of Towersof Hanoi Bash

Page 1: 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.### ... ... ...# | | | | | |

Page 2: Towersof Hanoi Bash

# _|_|_ | | | |# |_____| | | | |# |_______| | | | |# |_________| | | | |# |___________| | | | |# | | | | | |# .--------------------------------------------------------------.# |**************************************************************|# #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)

Page 3: Towersof Hanoi Bash

# 2) Explain the workings of the workings of the "dohanoi" function.# (Difficult)

Prev Home NextLocal Variables Up Aliases