asuerhao's Blog

如果有什么做的不到的地方请尽管留言, 我会改进的 : )

汉诺塔的递归实现

    汉诺塔问题简介: http://zh.wikipedia.org/wiki/%E6%B1%89%E8%AF%BA%E5%A1%94

    其递归实现的函数原型为: 'void hanoi(int n, char a, char b, char c);'.  其中字符变量'a', 'b', 'c'分别表示从杆子a, 杆子b, 杆子c, 整数变量'n'表示汉诺塔问题的阶数(即杆子a上有n个待移动到杆子c的圆盘, 杆子b作为临时杆子).

    其递归实现的步骤为:
  1. 如果n==1, 则直接将唯一的圆盘从杆子a移动到杆子c, 问题解决.
  2. 否则, 将杆子a上的(n-1)个圆盘移动到杆子b(通过递归实现),
       然后将杆子a上剩余的最大的圆盘移动到杆子c,
       最后将杆子b上的(n-1)个圆盘移动到杆子c(通过递归实现), 问题解决.

其递归实现的C代码为:

#include<stdio.h>
void hanoi(int, char, char, char);
int main(void)
{
	int n=3;
	printf("输入数字n:\n");
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C');
	return 0;
}
void hanoi(int n, char a, char b, char c)
{
	if(n==1) {
		printf("%c->%c\n", a, c);
	} else {
		hanoi(n-1, a, c, b);
		printf("%c->%c\n", a, c);
		hanoi(n-1, b, a, c);
	}

}

  之前在笔试中遇到的, 记录一下.

:() { :|:&};: 解析

  看了《千万千万不要运行的Linux命令》一文, 讲过一段千万不要在命令行执行的不知所云的符号:

:(){:|:&};:

  其实这段脚本是无法直接执行的,它存着语法错误,修正如下:

:() { :|:&};:

  它实际上定义并调用了一个Shell函数,这个函数会不停的在后台通过管道调用它自己,形成一个永远无法返回的递归,然后瞬间主机的资源就会被耗尽,不得不断电重启,至少我当时不得不断电重启电脑.