汉诺塔递归运算

17 February 2011

个人认为“汉诺塔”问题是应用递归函数最具有代表性的例子。应用递归函数可以把原来很极其复杂的问题简单化。

hanoi

这里是用递归函数写的“汉诺塔”:

hanoi = function(N,A,B,C){
  if(N == 1)
    cat(paste(A,"=>",C,"\n")) else
      if(N > 1){
        Recall(N-1,A,C,B)
        cat(paste(A,"=>",C,"\n"))
        Recall(N-1,B,A,C)
      }
}
hanoi(3, "A", "B", "C")

这是运行的结果:

A => C
A => B
C => B
A => C
B => A
B => C
A => C 

递归的思想非常的清晰:

  1. (考虑最简单的情况)A杆上如果只有一个盘子,那么直接把它移到C上,问题解决。
  2. (运用递归思想)先把前N-1个盘子从A移到B上,再把A的最后一个盘子移到C上,最后再把B上的N-1个盘子移到C上。

把握住这个大的思路,上面的代码就非常容易理解了。

blog comments powered by Disqus