Go语言中的递归

66 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

文章概览

  • 深入理解函数
  • 递归

一、函数

 经常把一些功能、代码中多次使用的代码块包装成函数,因此达到更容易理解、减轻代码量的效果。

数据分配

  • 基本数据类型一般会被分配到栈区,编译器存在逃逸分析。
  • 引用数据类型一般会分配到堆区,编译器存在逃逸分析。

函数注意事项

  • 函数的形参可以有多个,并且返回值也可以有多个。
  • 形参和返回值的数据可以是值类型的也可以是引用类型的。
  • 函数的命名和变量命名一样要遵循标识符命名规范,其首字母不可以是数字,大写可以被包外文件和函数访问,首字母小写就仅能被包内函数使用。
  • 如果变量是在函数内声明的,那么也是局部的,不能在函数外使用。
  • 基本数据类型和数组都是值传递(即进行值拷贝)。在函数内发生的修改,不会影响到原来的值。
  • 当需要在函数内改变函数外变量的值时,可以传入变量的地址&,函数内以指针的方式操作变量,从效果上看类似引用。
  • 在Go中,函数并不支持重载。

二、递归

基本介绍

 如果一个函数自己调用了自己,则称其为递归调用。

代码示例

func main() {   
    fmt.Println(f(10))		// 55
}
func f(n int) (res int) {
    if n < 2 {
        return n
    }
    return f(n-1) + f(n-2)	// f(10) = f(9) + f(8)
}

递归原则

  • 当执行一个函数时,创建一个新的函数栈(受保护的独立空间)。
  • 属于函数的局部变量是不会相互影响的,是独立的。
  • 递归必须向结束递归的条件循进行,否则这就是死循环了。
  • 如果一个函数执行完成,或者碰到return,就会返回,并且遵守谁调用,就将结果return给谁。