即使不使用局部变量, 函数也可以递归的调用自身.
例子 23-14. 汉诺塔
1 #! /bin/bash 2 # 3 # 汉诺塔 4 # Bash script 5 # Copyright (C) 2000 Amit Singh. All Rights Reserved. 6 # http://hanoi.kernelthread.com 7 # 8 # 在bash version 2.05b.0(13)-release下通过测试 9 # 10 # 经过脚本原作者同意 11 #+ 可以使用在"Advanced Bash Scripting Guide"中. 12 # 本书作者对此脚本做了少许修改. 13 14 #=================================================================# 15 # 汉诺塔是由Edouard Lucas提出的数学谜题, 16 #+ 他是19世纪的法国数学家. 17 # 18 # 有三个直立的柱子竖在地面上. 19 # 第一个柱子上有一组盘子套在上面. 20 # 这些盘子是平的, 中间有孔, 21 #+ 可以套在柱子上面. 22 # 这些盘子的直径不同, 它们从下到上, 23 #+ 按照尺寸递减的顺序摆放. 24 # 也就是说, 最小的在最上边, 最大的在最下面. 25 # 26 # 现在的任务是要把这组盘子 27 #+ 从一个柱子上全部搬到另一个柱子上. 28 # 你每次只能将一个盘子从一个柱子移动到另一个柱子上. 29 # 你也可以把盘子从其他的柱子上移回到原来的柱子上. 30 # 你只能把小的盘子放到大的盘子上, 31 #+ 反过来就*不*行. 32 # 切记, 这是规则, 绝对不能把大盘子放到小盘子的上面. 33 # 34 # 如果盘子的数量比较少, 那么移不了几次就能完成. 35 #+ 但是随着盘子数量的增加, 36 #+ 移动次数几乎成倍的增长, 37 #+ 而且移动的"策略"也会变得越来越复杂. 38 # 39 # 想了解更多信息的话, 请访问http://hanoi.kernelthread.com. 40 # 41 # 42 # ... ... ... 43 # | | | | | | 44 # _|_|_ | | | | 45 # |_____| | | | | 46 # |_______| | | | | 47 # |_________| | | | | 48 # |___________| | | | | 49 # | | | | | | 50 # .--------------------------------------------------------------. 51 # |**************************************************************| 52 # #1 #2 #3 53 # 54 #=================================================================# 55 56 57 E_NOPARAM=66 # 没有参数传给脚本. 58 E_BADPARAM=67 # 传给脚本的盘子个数不符合要求. 59 Moves= # 保存移动次数的全局变量. 60 # 这里修改了原来的脚本. 61 62 dohanoi() { # 递归函数. 63 case $1 in 64 0) 65 ;; 66 *) 67 dohanoi "$(($1-1))" $2 $4 $3 68 echo move $2 "-->" $3 69 let "Moves += 1" # 这里修改了原脚本. 70 dohanoi "$(($1-1))" $4 $3 $2 71 ;; 72 esac 73 } 74 75 case $# in 76 1) 77 case $(($1>0)) in # 至少要有一个盘子. 78 1) 79 dohanoi $1 1 3 2 80 echo "Total moves = $Moves" 81 exit 0; 82 ;; 83 *) 84 echo "$0: illegal value for number of disks"; 85 exit $E_BADPARAM; 86 ;; 87 esac 88 ;; 89 *) 90 echo "usage: $0 N" 91 echo " Where \"N\" is the number of disks." 92 exit $E_NOPARAM; 93 ;; 94 esac 95 96 # 练习: 97 # ----- 98 # 1) 这个位置以下的代码会不会被执行? 99 # 为什么不? (容易) 100 # 2) 解释一下这个运行的"dohanoi"函数的运行原理. 101 # (比较难) |