go - 说明:函数在 go 中返回相同的函数
问题描述
func main() {
go spinner(100 * time.Millisecond)
const n = 45
fibN := fib(n) // slow
fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
}
func spinner(delay time.Duration) {
for {
for _, r := range `-\|/` {
fmt.Printf("\r%c", r)
time.Sleep(delay)
}
}
}
func fib(x int) int {
if x < 2 {
return x
}
return fib(x-1) + fib(x-2)
}
你能解释一下上面的 fib 函数,结果是如何得到的。
fib 函数返回一个 fib 调用,最终结果是怎么来的?
解决方案
关键在于这个函数:
func fib(x int) int {
if x < 2 {
return x
}
return fib(x-1) + fib(x-2)
}
如果x<2
函数立即返回,否则它从调用中检索结果,fib
并使用较小的值x
对于递归调用,有 3 条递归定律:
- 递归算法必须有一个基本情况。
- 递归算法必须改变它的状态并朝着基本情况移动。
- 递归算法必须递归地调用自身。
http://interactivepython.org/courselib/static/pythonds/Recursion/TheThreeLawsofRecursion.html
在您的示例中,基本情况是 when x < 2
。状态变化是减少 1 或 2,并且您的函数递归调用自身,因此满足三个定律。
推荐阅读
- ios - 这是在 swift Alamofire 或 swift 给出的默认 API 调用中进行 api 调用的最佳方式
- html - 使用纯 css 格式化单词
- powershell - 从变量创建映射驱动器
- python - 如何比较两个目录并在python中输出更改的文件
- javascript - 无法突出显示最多 6 个 gmail 内容
- javascript - 使用 textContent 溢出自动换行
- ios - 文件无法打开,因为您没有查看权限
- laravel - laravel 5.4 pusher(laravel echo)私人频道出现403错误
- java - Hibernate 5 CriteriaBuilder 按id查询
- javascript - 我想在我的地图中添加更多站点(站点)