新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
你将代码整个在脑子里走一遍就明白了
创新互联建站专注于甘南网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供甘南营销型网站建设,甘南网站制作、甘南网页设计、甘南网站官网定制、小程序开发服务,打造甘南网络公司原创品牌,更为您提供甘南网站排名全网营销落地服务。
首先从外部调用f(5)进入方法
这时方法内的参数x为5
那么if(x == 1)这个条件不成功继续执行else
else里再次调用了本方法f(x - 1),只是参数变成了4
这样一直排执行到x=1时弹出alert("1");
注意,这时方法并没有执行结束,有没有忘记
前面执行else的时候只想着再次调用了本方法f(x - 1),但是后面还有一句呢alert(x);
当弹出1时相当于上一个else里的f(x - 1);这条执行结束了,那接下来是不是还要执行alert(x);
同样的前面的alert(x);都在等待后面的语句执行完一一都会执行一次
现在是否明白了
其实难点就在于对递归函数的理解。所谓递归函数,就是函数在执行时调用自己。程序在调用一个函数时,首先执行这个函数的程序,执行完毕后返回到原调用前的上一级程序继续运行这一级程序。调用递归函数也是如此,在执行完递归函数,得到3之后,它要退出递归函数回到调用它的原来的主程序继续去执行原来的主程序。由于调用递归函数时程序是逐级进行的,所以返回时也是逆向逐级执行程序并返回的,即在得到3后,返回上一级执行这一级的程序就得到4(即再次执行document.writeln(num1)),再返回上一级执行这一级的程序得到5(即再次执行document.writeln(num1))。
function getArrayValue(){ var arr = new Array(['a','b','c'],['d','e','f']);//二维数组 for(i=0;iarr.length;i++){ var tmpArr = new Array(); tmpArr = arr[i]; for(j=0;jtmpArr.length;j++){ var tmp = tmpArr[j]; alert(tmp); } } } 给你一个例子,多维的话可以在循环。(可能方法比较笨,但是好用)
我先来解释无限递归
先举一个生活中的例子,就是那个经典的《老和尚给小和尚讲故事》的故事:
从前有座山,山里有个庙,庙里有个老和尚给小和尚讲故事。
讲的是什么故事呢?
讲的是:
从前有座山,山里有个庙……
这就是无限递归了。
再来说一下你的程序发生无限递归的原因:
ajQuery 是一个函数。执行这个函数时,函数中的 return 语句会返回一个值。
它会返回什么值呢?
返回值是执行一个新的 ajQuery 函数的返回值,
那么这个新的 ajQuery 函数会返回什么值呢?
这个新的 ajQuery 函数会返回又一个新的 ajQuery 函数的返回值,
……
这是无限递归,也是一种死循环。
最后说一下发生溢出的原因:
每次执行 ajQuery 函数,
都会在结束前执行又一个新的 ajQuery 函数,
并等待它结束,然后自身才能结束。
每执行一个函数都要占用一些资源,只有函数结束后才有可能释放这些资源。
可是,在无限递归过程中,不断地执行一个又一个函数,却从不结束这些函数。
所以,占用的资源就会越来越多。
直到占用的资源超出了允许的范围,就溢出了!
var a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
// 递归赋值
setval(1, 100);
// 打印验证
document.write('打印验证:br');
for (var i=1;i=10;i++) {
document.write('a'+i+' = ');
eval('document.write(a'+i+')');
document.write('br');
}
function setval($var_i, $var_val) {
if ($var_i 10) return false;
eval('a' + $var_i + ' = ' + $var_val + ';');
$var_i ++;
$var_val += 100;
setval($var_i, $var_val);
}