我遇到了以下代码,以生成给定字符串的排列。
package main
import (
"fmt"
)
func main() {
Perm([]rune("abc"), func(a []rune) {
fmt.Println(string(a))
})
}
func Perm(a []rune, f func([]rune)) {
perm(a, f, 0)
}
func perm(a []rune, f func([]rune), i int) {
if i > len(a) {
f(a)
return
}
perm(a, f, i+1)
for j := i + 1; j < len(a); j++ {
a[i], a[j] = a[j], a[i]
perm(a, f, i+1)
a[i], a[j] = a[j], a[i]
}
}
我很难理解该程序的工作原理。特别是在func perm中调用f(a)
的退出条件。有人可以解释f(a)的含义吗?
我尝试打印fmt.Println(f(a))
,但出现错误。
答案 0 :(得分:1)
您发现了一个关闭!
Also known as an anonymous function.
基本上,它是一个一次性功能,不会超出其范围。
对于打印无效,部分原因是匿名性,部分原因是它没有打印返回值。如果您真的想进入它,可以尝试打印&f生成一个指针,以便您有一个值可以打印出来。