美文网首页
How to think:递归和数独试探算法

How to think:递归和数独试探算法

作者: 过客 | 来源:发表于2018-04-20 10:14 被阅读30次

    上次说的计算算法可以根据游戏规则把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,得到结果!

    递归有什么好处呢?就是简单!

    看过盗梦空间的话,递归的形式,就类似它的梦套梦!

    相关文章

      网友评论

          本文标题:How to think:递归和数独试探算法

          本文链接:https://www.haomeiwen.com/subject/yvzokftx.html