为什么用JavaScript编写的递归函数不经过所有的迭代,但在C和C++中工作正常[duplicate]

szqfcxe2  于 2023-02-17  发布在  Java
关注(0)|答案(1)|浏览(88)
    • 此问题在此处已有答案**:

(18个答案)
昨天关门了。

    • 我一直在尝试重新创建此C程序的JavaScript版本。**

程序假设从数组集中的字符生成所有可能的组合。基本上有两个函数printAllKeyLengthprintAllKeyLengthR。每次调用第二个函数时,它检查k变量,当k等于0时打印结果,其中的for循环遍历字符集的长度,并将每个字符添加到变量前缀和变量新前缀。之后,它会反复调用自己,直到它的每个变量都导致它的k变量等于零。C程序工作正常,但JavaScript只在最后几次调用函数时完成,这导致结果不完整。之前的其余调用被省略。我尝试将JavaScript函数更改为异步函数,但没有成功。有人能解释为什么会发生这种情况,以及如何在不完全改变程序的功能和结构的情况下修复它吗?
[C语言]---此版本可以正常工作,但JavaScript版本无法正常工作{见下文}

#include <stdio.h>
#include <string.h>

int c = 0, chct;
char subs[10];
char set0[27] = "";

void
printallkeylengR(char set[], char prefix[], int n, int k)
{

    if (k == 0) {
        printf("%s\n", prefix);
    }
    else {
        for (int i = 0; i < n; i++) {
            char newprefix[10] = "";

            char tmp[2] = "";

            tmp[0] = set[i];
            strcpy(subs, prefix);
            strcat(prefix, tmp);
            strcpy(newprefix, prefix);
            strcpy(prefix, subs);

            printallkeylengR(set, newprefix, n, k - 1);
        }
    }
}

void
printallkeyleng(char set[], int k, int n)
{

    char ch[1] = "";

    printallkeylengR(set, ch, n, k);
}

int
main()
{

    chct = 0;
    for (int i = 65; i <= 90; i++) {
        set0[chct] = i;
        chct += 1;
    }
    set0[27] = '\0';

    printallkeyleng(set0, 4, strlen(set0));

    return 0;
}

[Javascript]---不迭代所有结果!!!

function printAllKeyLengthR(set,prefix,n,k){
    if(k==0){
        document.body.appendChild(document.createTextNode(prefix+" "));
        }

    else{
    console.log("Prefix "+prefix+" K= "+k)

    for(i=0;i<n;i++){
        newprefix=prefix.toString()+set[i].toString();
    console.log("New Prefix "+newprefix+" K= "+k+" i= "+i);console.log("   ");
        const x = printAllKeyLengthR(set,newprefix,n,k-1)
        
    }
    
}
}

function printAllKeyLength(set,k,n){
    printAllKeyLengthR(set,"",n,k);
}

set=["0","1","2","3","4","5","6","7","8","9"];

//printAllKeyLength(set ,final_length,no_of_elem)
printAllKeyLength(set,4,10)
sh7euo9m

sh7euo9m1#

JavaScript实现的问题在于for循环在进入下一次迭代之前没有等待递归调用完成,因此下一次迭代可能在上一次迭代完成之前就开始了,从而导致结果不完整。

相关问题