递归函数就是会直接或者间接调用自身的一种函数。递归是一种强大的编程技术,它把一个问题分解为一组相似的子问题,调用自身去解决它的子问题。
一、汉诺塔

问题描述:有3根柱子和一套直径各不相同的空心圆盘。开始时源柱子上的所有圆盘都按照从小到大的顺序堆叠。目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程中不允许把较大的圆盘放置在较小的圆盘上。
var hanoi=function(disc,src,aux,dst){
if(disc>0){
hanoi(disc-1,src,dst,aux);
console.log("move "+disc+" from "+src+" to "+dst);
hanoi(disc-1,aux,src,dst);
}
}
圆盘数量为3的时候解法为:
javascript递归_第1张图片

hanoi函数把一堆圆盘从一根柱子移动到另一根柱子,必要时使用辅助的柱子。
它把问题分解成3个子问题:
首先,移动一对圆盘中较小的圆盘到辅助柱子上,从而露出下面较大的圆盘。
然后,移动下面较大的圆盘到目标柱子上。
最后,它将刚才较小的圆盘从辅助的柱子上再移动到目标柱子上。
传递给hanoi函数的参数包括当前移动的圆盘编号和它将用到的3根柱子。当它调用自身的时候,它去处理当前正在处理的圆盘之上的圆盘。最终,它会以一个不存在的圆盘编号去调用。此时,不执行任何操作。由于该函数对非法值不予理会,就不用担心它会导致死循环。
二、DOM遍历

递归函数可以非常高效地操作树形结构,比如浏览器文档对象模型DOM。每次递归调用处理指定树的一小段。
html结构如下:

测试div
测试span
test1 div

js如下: