gpt4 book ai didi

Go 中的递归

转载 作者:IT王子 更新时间:2023-10-29 02:22:33 25 4
gpt4 key购买 nike

我的职业是 Javascript 开发人员,因此决定试一试 Go。作为一项学习练习,我决定在我的一个节点项目中移植一个函数,但无法让它在我的生活中发挥作用。该函数的目的是显示所有可以由不同单词中出现的字母组成的有效英语单词(我正在构建 Text Twist 的多人游戏版本)。例如,findAllWords("dan​​ces") 将返回 ['can','scan','dance','dances',etc...]。我通过递归从英语单词列表构建的 trie 来实现这一点。

这是函数在 Javascript 中的实现:

self.findAllWords = function(letters = [], trie = dictionary, curString = '') {
let words = [];
letters = typeof letters === 'string' ? letters.split('') : letters;
letters.forEach( (letter,i,ar) => {
if (!trie[letter]) return;
let curWord = curString + letter;
let newTrie = trie[letter];
let newLetters = [...ar.slice(0,i),...ar.slice(i+1)];
if (trie[letter][FLAG_INDEX]) words.push(curWord);
if (self.isValidPrefix(curWord, dictionary)) words = [...words,...self.findAllWords(newLetters,newTrie,curWord)];
});
return uniq(words);
}

这是我在 Go 中复制它的尝试(使用 this trie 实现):

func FindAllWords(letters []rune, node *Node, curString string) []string {

words := []string{}
for i, let := range letters {
n, ok := node.Children()[let]

if !ok {
return words
}
curWord := curString + string(n.val)
newLetters := []rune{}
newLetters = append(newLetters, letters[:i]...)
newLetters = append(newLetters, letters[i+1:]...)

if n.term {
words = append(words, curWord)
}

words = append(words, FindAllWords(newLetters, n, curWord)...)
}
return words
}

很想知道为什么会失败,我如何让它工作,以及我滥用/不使用的任何约定。谢谢!

最佳答案

这可能是也可能不是 Go 代码的唯一问题,但是 for 循环中的 return 语句与 javascript forEach 中的 return 语句做的事情不同。

在javascript 代码中的匿名函数内返回从匿名函数返回到findAllWords 函数内。在 Go 中返回 for 循环从 FindAllWords 返回。当遇到不在 trie 根目录中的字母时,这将过早地停止操作。我认为您遇到的问题是返回的 []string 为空或不完整。

您应该使用 break 而不是 return words .

关于Go 中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41421093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com