以javascript递归方式生成在手机键盘上键入的所有可能单词

以javascript递归方式生成在手机键盘上键入的所有可能单词,javascript,recursion,Javascript,Recursion,用javascript生成手机键盘上键入的所有可能的单词 假设您可以访问api来识别正确的单词 编辑:我的记忆力很差,所以我很抱歉,但我记不清确切的措辞,问题与这里相同: 我最近参加了一次求职面试的技术测试,但被上面的问题击中了,我想我失败了,因为递归是我从来没有想过的事情。这个问题假设我可以访问一个api来识别正确的单词,我没有在这一部分进行编码,因为这是我可以很容易地添加的东西 我想知道我哪里出错了,这样下次我就有更好的机会了。到目前为止,我掌握的代码是: 不过,他的答案是java,而不是

用javascript生成手机键盘上键入的所有可能的单词

假设您可以访问api来识别正确的单词

编辑:我的记忆力很差,所以我很抱歉,但我记不清确切的措辞,问题与这里相同:

我最近参加了一次求职面试的技术测试,但被上面的问题击中了,我想我失败了,因为递归是我从来没有想过的事情。这个问题假设我可以访问一个api来识别正确的单词,我没有在这一部分进行编码,因为这是我可以很容易地添加的东西

我想知道我哪里出错了,这样下次我就有更好的机会了。到目前为止,我掌握的代码是:

不过,他的答案是java,而不是javascript。我已将此函数用作参考,但还无法使其工作

    keypad_mapings =    [
                                [],
                                ['a','b','c'],
                                ['d','e','f'],
                                ['g','h','i'],
                                ['j','k','l'],
                                ['m','n','o'],
                                ['p','q','r','s'],
                                ['t','u','v'],
                                ['w','x','y','z']
                        ];

    get_all_words([1, 2, 3]);


    function get_all_words(pressed_buttons) {
        var letters = [];
        for(i=0; i<pressed_buttons.length; i++) {
            letters.push(keypad_mapings[pressed_buttons[i]]);
        }

        var progress = 0;
        current_word = '';
        limit = pressed_buttons.length;
        found_words = [];

        var return_value = recursive_word_generator(letters, progress, current_word, limit, found_words);
        console.log(return_value);
    }


    function recursive_word_generator(letters, progress, current_word, limit, found_words) {

        // I expect this to only be zero in first iteration, all recursive calls should be incremented to some degree
        console.log(progress);

        if(current_word.length >= limit) {
            if(current_word.length == limit){
                found_words.push(current_word);
            }
            return found_words;
        }else{
            //itterating button presses
            for(i=0; i<letters.length; i++) {
                current_letters = letters[i];
                console.log(current_letters);
                for(i = progress; i<letters.length; i++) {
                    current_word = current_word.concat(current_letters[i]);
                    found_words = recursive_word_generator(letters.slice(1), i, current_word, limit, found_words);
                }
            }
        }
        return found_words
    }

编辑:我现在正确地得到了前3个结果,但是递归似乎不起作用,我希望进度变量在递归中递增,但当我记录它时,它的值总是0。我觉得我离正确答案太近了…

看来你真正出错的地方就在你的圈子里。在递归函数中,您正在循环每个按键。但是,对递归函数的每次调用实际上都应该处理一次按键。相反,循环应该覆盖该调用中正在处理的按键的可能字母:


这是确切的措辞吗?这似乎有点奇怪。我会编辑这个问题,尽量更准确。我看不到这个问题。假设DICT存储在服务器上,反复ping服务器以查看是否存在单词,这将是非常愚蠢的,在这里,只需要用字母ping,然后服务器只需选择以输入的字母开头的前10名。你可以轻松地在自动完成时显示多达10个单词。不过这并不可怕,用这种方法来解决它,只需快速进行您需要的任何编辑,我会尝试写一个解决方案为了解决这个问题,一旦它开始工作,我将编写一个返回true的函数,不管它在什么地方代替了想象中的api调用。我确实尝试过自己转换它。我发布的代码就是这种尝试,但在递归方面遇到了困难,我看到了两个嵌套的循环,这让我很困惑。这里给出的答案告诉了我哪里出了问题。这不是我想要的真正有效的代码,我想了解发生了什么。一个小提示。您甚至不需要从函数中返回任何内容。一旦递归完成,您可以在调用函数中简单地使用find_单词。我在回答中没有提到这一点,因为它实际上并不影响代码的问题。非常感谢你出色的回答。多亏了你,我现在知道我的错误是:在最初的if陈述中,我没有将进步作为成功的触发器。for循环中的i是一个全局循环,因此破坏了递归。我是双重循环。我明白我现在做错了什么,这很完美:
function recursive_word_generator(letters, progress, current_word, limit, found_words) {

    if (progress == limit) {
        // completed word, add to collection
        found_words.push(current_word);
    } else {

        // make recursive call for each letter in current press
        for (var i = 0; i < letters[progress].length; i++) {
            var next_word = current_word + letters[progress][i];

            recursive_word_generator(letters, progress + 1, next_word, limit, found_words);
        }
    }

    return found_words
}