上次说的计算算法可以根据游戏规则把100%确凿的数字填入空格,对于可以填入不止一个数字的数独空格,有一个简单的办法来解决:试探!我可以依次填入可填的数字,并计算或者试探剩下的空格,重复下去直到全部填满,或者出现矛盾(如下图):
你能找出每一个矛盾的方格矛盾在什么地方吗?
试探法的流程图:
从流程图上你就会看出来,这个算法有一个不同寻常的地方,在试探了一个格子之后,它会把试探后的棋盘当作一个新参数,再次调用自己去解决问题!
这种解题的方法,我们称之为递归,类似一只咬住了自己尾巴的蛇!
让我用一个简单的例子来告诉你什么叫做递归:
比如,计算阶乘:3!= 3 x 2 x1,“!”是阶乘符号!普通的做法就是用循环乘法来解决。
换一个思路,计算n的阶乘,可以换算成n* (n-1)!,本来,我们的目标是n的阶乘,我们换成了一个跟A很相似的目标:n乘以n-1的阶乘,这个目标,简单了一点点,总体上,还是使用了A自身(阶乘算法)。递归,就是调用自身,可以简单的如此理解!
现在,n-1的阶乘可以进一步理所当然的换成(n-1)* (n-2)!
递归,就是一步步的进入更深层的自己,
一步步的进入更深层,当然是离问题更远了,它必然有个返回的地方,否则,程序永远不会有结束的时候,也就不会有结果,问题也就不会得到解决!
这里,n一直减下去,直到不能再减,正好,直到1,正好,1的阶乘我们是知道的:1!
从这里,递归的深入开始返回,返回到了1+1的地方,于是我们得到2的阶乘是2x1 = 2,注意,这里的2x1不是阶乘定义上的2x1,是n的阶乘= (n* (n-1)的阶乘)的2x1!
再进一步的返回,到3 了,3!= 3 x(2的阶乘) = 3X2 = 6
再返回,到4, 4! = 4 x3的阶乘 = 4x6=24!
......
直到n,得到结果!
递归有什么好处呢?就是简单!
看过盗梦空间的话,递归的形式,就类似它的梦套梦!