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