Haskell模式匹配:递归调用中(zs)与(y:zs)的差异及问题排查
递归参数
zs与y:zs的差异分析 先明确你的核心逻辑:从路径列表里拿x和y对比,相交就把x存入累加器,接着继续用x和剩下的路径对比。下面直接说两个参数的本质区别:
传
zs的情况
当x和y相交后,递归时直接传排除了当前y的剩余路径列表。意思就是:和y的对比已经做完了,接下来只需要用x去对比剩下没碰过的路径,y不会再参与后续的任何检查。
比如你的路径列表是[x, y1, y2, y3],x和y1相交后,递归就传[y2,y3],后续只检查x和y2、y3的相交情况,y1不会再被拿出来对比。传
y:zs的情况
当x和y相交后,递归时把y重新放回剩余路径的最前面。这就意味着:刚才和x对比过的y,会被再次拿出来和x(甚至后续其他路径)重复对比。
还是上面的例子,x和y1相交后,递归传[y1,y2,y3],接下来会再次检查x和y1是否相交,不仅做了无用功,还可能因为反复触发相交逻辑,导致累加器里重复存x,甚至陷入无限递归死循环。
结合你的需求来看,你要的是“继续后续对比”——也就是对比剩下没处理过的路径,所以zs才是符合逻辑的参数。用y:zs会因为重复处理已对比过的y,导致结果错误,甚至程序跑不起来。
内容的提问来源于stack exchange,提问作者Rara
相关产品推荐
相关产品推荐

