I can not access global variable

3

I am trying to use the heap algorithm to find the possible permutations of a string. The problem is that I create a variable perm global to count every time I have a permutation but I can not see it in an alert.

var perm=0;

function perm(str){

    var map={};
    var cnt=[];
    var letters=[];
    var length=str.length;
    var result=[];
    str=str.split("");  
    str=str.sort();
    alert(str);


    for(var i=0;i<str.length;i++){

        if(map[str[i]]) map[str[i]].cnt++;
        else map[str[i]] ={val:str[i],cnt:1};


    }

    for(var item in map){

        letters.push(map[item].val);
        cnt.push(map[item].cnt);

    }

    permAlone(letters,cnt,result,length,0);




}



function permAlone(str,cnt,result,length,level) {



    if(level===length){
        perm++;  
        return;

    } 


    for(var i=0;i<str.length;i++){
    //noprotect 


           if(cnt[i]===0) {continue;}


            result[level]=str[i];
            cnt[i]--;

            permAlone(str,cnt,result,length,level+1);
            cnt[i]++;


    }   



}



perm('aab');
alert(perm);  
    
asked by Juan 21.11.2016 в 00:29
source

2 answers

2

That's because you name your function equal to your variable. Call them different, for example, name your function permu .

Your corrected code:

var perm=0;

function permu(str){

    var map={};
    var cnt=[];
    var letters=[];
    var length=str.length;
    var result=[];
    str=str.split("");  
    str=str.sort();
    alert(str);

    for(var i=0;i<str.length;i++){
        if(map[str[i]]) map[str[i]].cnt++;
        else map[str[i]] ={val:str[i],cnt:1};
    }

    for(var item in map){
        letters.push(map[item].val);
        cnt.push(map[item].cnt);
    }
    permAlone(letters,cnt,result,length,0);
}

function permAlone(str,cnt,result,length,level) {

    if(level===length){
        perm++;  
        return;
    } 
    
    for(var i=0;i<str.length;i++){
 
           if(cnt[i]===0) {continue;}

            result[level]=str[i];
            cnt[i]--;
            
            permAlone(str,cnt,result,length,level+1);
            cnt[i]++;
    }   
}

permu('aab');
alert(perm);
    
answered by 21.11.2016 / 00:34
source
0

Does not this have to do with declaring the variable and then a function with the same name? This is going to give you an error. Change the variable, for example, to xxx:

var xxx=0;

function perm(str){

    var map={};
    var cnt=[];
    var letters=[];
    var length=str.length;
    var result=[];
    str=str.split("");  
    str=str.sort();
    alert(str);


    for(var i=0;i<str.length;i++){

        if(map[str[i]]) map[str[i]].cnt++;
        else map[str[i]] ={val:str[i],cnt:1};


    }

    for(var item in map){

        letters.push(map[item].val);
        cnt.push(map[item].cnt);

    }

    permAlone(letters,cnt,result,length,0);




}



function permAlone(str,cnt,result,length,level) {



    if(level===length){
        xxx++;  
        return;

    } 


    for(var i=0;i<str.length;i++){
    //noprotect


           if(cnt[i]===0) {continue;}


            result[level]=str[i];
            cnt[i]--;

            permAlone(str,cnt,result,length,level+1);
            cnt[i]++;


    }   



}



perm('aab');
alert(xxx);
    
answered by 21.11.2016 в 00:37