fke7985 发表于 2005-1-30 14:11:32

研究一下算法

有谁用shell写个汉诺塔的算法来呀?
递归非递归都可以,我只用C写过,Shell不会

kornlee 发表于 2005-1-30 18:16:53

弱弱的问,啥是什么什么塔?:cry:

fke7985 发表于 2005-1-30 19:55:17

~(!*)@&#)(&!)($)!*$^*!&^*()&!(^$*(&!%^@#!@#

计算机专业应该会知道的

kornlee 发表于 2005-1-30 19:57:55

~(!*)@&#)(&!)($)!*$^*!&^*()&!(^$*(&!%^@#!@#

计算机专业应该会知道的
偶不是这个专业滴:evil:

亿性 发表于 2005-1-30 22:59:11


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

把这段代码保存为一个脚本(比如就叫hanoi),然后运行sh hanoi x就可以了(x用一个数字代替,表示圆盘的个数)
另外,代码没有加任何的合法性判断,只做算法演示之用

fke7985 发表于 2005-1-31 10:34:27

能不能用非递归的试试?

亿性 发表于 2005-1-31 22:56:31

非递归就要长点了,个人认为,hanoi问题写非递归没任何意义

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

用法和上面递归的一样

updatedb 发表于 2005-2-1 19:58:53


非递归就要长点了,个人认为,hanoi问题写非递归没任何意义
页: [1]
查看完整版本: 研究一下算法