用js做leetcode的时候用到了递归调用,但是出现了Maximum call stack size exceded
这个栈溢出跟js的默认传参有关系,在这里做一点记录。代码如下,这个时用暴力法直接做正则匹配的题
var match = function(s,p,ss,pp){
if(pp === p.length){ //笔记模式串
return ss === s.length;
}
//p不是*时直接匹配
if(p[pp+1] != '*'){
if(s[ss]!=p[pp] && p[pp]!='.'){
return false;
}else{
return match(s,p,ss+1,pp+1);
}
}
//p[pp+1] = '*' ,如果pp+2后面的可以匹配ss那么成功,否则循环ss++,知道不匹配
while(ss < s.length && (p[pp] == '.' || s[ss] == p[pp])){
if(match(s,p,ss,pp+2)){
return true;
}
ss++;
}
//上面的不匹配时pp跳过*
return mathc(s,p,ss,pp+2)
};
我在运行时直接调用了match(s,p),出现了上面报的错误,需要多写一个函数,比较js没有指针,只能多加参数表示值的位置:
var isMatch = function(s, p) {
return match(s,p,0,0);
};
这里要说一下的是,如果直接调用match(s,p),本来传四个参数的,只传入了两个,后面两个会时undefined,而undefined在函数里面做运算的时候会时NaN,这样造成的无限递归,导致栈溢出