研究一下算法

研究一下算法

有谁用shell写个汉诺塔的算法来呀?
递归非递归都可以,我只用C写过,Shell不会
弱弱的问,啥是什么什么塔?  
~(!*)@&#)(&!)($)!*$^*!&^*()&!(^$*(&!%^@#!@#

计算机专业应该会知道的
[quote:54dd72d4b1="fke7985"]~(!*)@&#)(&!)($)!*$^*!&^*()&!(^$*(&!%^@#!@#

计算机专业应该会知道的[/quote]
偶不是这个专业滴  
[code:1]
move() {
  echo "Move disc $2 from $1 to $3"
}

hanoi() {
  if [ "$1" == "1" ]
    then
      move $2 1 $4
    else
      hanoi $[ $1-1 ] $2 $4 $3
        move $2 $1 $4
        hanoi $[ $1-1 ] $3 $2 $4
    fi
}

hanoi $1 "x" "y" "z"
exit 0
[/code:1]
把这段代码保存为一个脚本(比如就叫hanoi),然后运行sh hanoi x就可以了(x用一个数字代替,表示圆盘的个数)
另外,代码没有加任何的合法性判断,只做算法演示之用
能不能用非递归的试试?
非递归就要长点了,个人认为,hanoi问题写非递归没任何意义
[code:1]
declare -a arrN
declare -a arrX
declare -a arrY
declare -a arrZ
move() {
  echo "Move disc $2 from $1 to $3"
}
push() {
  arrN[`expr $1+1`]=`expr $5 - 1`
  arrX[`expr $1+1`]="$2"
  arrY[`expr $1+1`]="$3"
  arrZ[`expr $1+1`]="$4"
}
hanoi() {
  top=0
  while [ "$top" -ge "0" ]
  do
    while [ "${arrN[$top]}" -gt "1" ]
    do
      push $top "${arrX[$top]}" "${arrZ[$top]}" "${arrY[$top]}" "${arrN[$top]}"
      let "top += 1"
    done
    if [ "${arrN[$top]}" -eq "1" ]
    then
      move "${arrX[$top]}" 1 "${arrZ[$top]}"
      let "top -= 1"
    fi
    if [ "$top" -ge "0" ]
    then
      move "${arrX[$top]}" ${arrN[$top]} "${arrZ[$top]}"
      push `expr $top - 1` "${arrY[$top]}" "${arrX[$top]}" "${arrZ[$top]}" ${arrN[$top]}
    fi
  done
}
arrX[0]="X"
arrY[0]="Y"
arrZ[0]="Z"
arrN[0]=$1
hanoi
unset arrX
unset arrY
unset arrZ
unset arrN
exit 0
[/code:1]
用法和上面递归的一样
引用:
非递归就要长点了,个人认为,hanoi问题写非递归没任何意义