<p>如果你给我一些反馈,我可以编辑它,因为它不完全是你所要求的,但它是jist。我将用一个技术性的解释进行编辑,以符合您的确切示例。在</p>
<pre><code>package main
import "fmt"
func main() {
words := []Word{
{text: "cat", synonyms: []string{"feline", "kitten", "mouser"}},
{text: "kitten", synonyms: []string{"kitty", "kit"}} ,
{text: "kit", synonyms: []string{"pack", "bag", "gear"}},
{text: "computer", synonyms: []string{"electronics", "PC", "abacus"}},
}
fmt.Println(areWordsRelated(words, words[0], words[2]))
fmt.Println(areWordsRelated(words, words[0], words[3]))
}
type Word struct{
text string
synonyms []string
}
func areWordsRelated(words []Word, word1, word2 Word) bool {
for _, elem := range word1.synonyms{
if elem == word2.text{
return true
} else {
for _, word := range words {
if word.text == elem {
if (areWordsRelated(words, word, word2)) {
return true
}
}
}
}
}
return false
}
</code></pre>
<p>编辑:这并没有像你所要求的那样做,因为它没有在“pack”和“cat”之间建立连接,因为pack不是由一个实际的word对象表示的,我定义了将word2作为对象接收的方法(只是完成您的示例)。我可以把它改为一个字符串,这样它就可以在返回之前检查“kit”的同义词数组中的“pack”,但是想法还是一样的。。。下面是算法的高级解释。在</p>
<p>迭代同义词,如果不匹配,在原始集合中找到<code>Word</code>对象,并将其作为第一个参数调用我自己。这将递归地耗尽每个路径,直到找到匹配项,或者没有剩余的路径,在这种情况下,您处于返回false的循环之外。上面的代码在go playground中运行并正确返回<code>true\nfalse</code>。请注意,递归调用是在if中进行的,以防止过早地返回false(这也是一种性能增强,因为我们在找到true时立即返回,而不是继续递归路径)。在</p>
<p><a href="https://play.golang.org/p/gCeY0SthU1" rel="nofollow">https://play.golang.org/p/gCeY0SthU1</a></p>