1. package main
  2. import "fmt"
  3. func test(n1 int) {
  4. n1++
  5. fmt.Println("test() n1=", n1)
  6. }
  7. func main() {
  8. n1 := 10
  9. test(n1)
  10. fmt.Println("main() n1=", n1)
  11. }
  12. // test() n1= 11
  13. // main() n1= 10

image.png

  • 在调用函数的时候,会为该函数分配一个新的内存空间(栈),和原有的空间区分开
  • 每个函数对应的栈中,数据空间时独立的,不会混淆
  • 当一个函数执行完毕后,程序会回收该函数对应的内存空间

return返回值

定义返回值类型列表

  1. func sum(n1 int, n2 int) (int, int) {
  2. return n1 + n2, n1 - n2 // 返回给调用者
  3. }
  4. func main() {
  5. total, reduce := sum(10, 20)
  6. fmt.Printf("total %T %v \n", total, total)
  7. fmt.Printf("reduce %T %v \n", reduce, reduce)
  8. }
  9. // total int 30
  10. // reduce int -10

函数的递归调用

在函数体内,调用本身
阶层实现

  1. func test(n int) {
  2. if n > 2 {
  3. n--
  4. test(n)
  5. }
  6. fmt.Println("n = ", n)
  7. }
  8. func main() {
  9. test(4)
  10. }
  11. n = 2
  12. n = 2
  13. n = 3

image.png

上面递归变形

  1. func test2(n int) {
  2. if n > 2 {
  3. n--
  4. test2(n)
  5. } else {
  6. fmt.Println("n = ", n)
  7. }
  8. }
  9. func main() {
  10. // test(4)
  11. test2(4)
  12. }
  13. // n = 2

image.png

注意点

1、执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
2、函数的局部变量是独立的,不会相互影响
3、递归必须向退出递归的条件逼近,否则就无线递归了
4、当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁。同时该函数被销毁。

斐波那契数

1 ,1 ,2 ,3 ,5 ,8, 13 ,21 ,……
f(n) = f(n-2) + f(n-1)

  1. func fbn(n int) int {
  2. if n == 1 || n == 2 {
  3. return 1
  4. } else {
  5. return fbn(n-2) + fbn(n-1)
  6. }
  7. }
  8. func main() {
  9. // 斐波那契数列
  10. // 1 ,1 ,2 ,3 ,5 ,8, 13 ,21 ,......
  11. // f(n) = f(n-2) + f(n-1)
  12. fmt.Println("value=", fbn(5)) // 第5个斐波那契数
  13. fmt.Println("value=", fbn(6)) // 第6个斐波那契数
  14. fmt.Println("value=", fbn(7))
  15. fmt.Println("value=", fbn(8))
  16. }
  17. value= 5
  18. value= 8
  19. value= 13
  20. value= 21

猴子吃桃问题

  1. // 猴子吃桃子
  2. // 每一天吃当天桃子数量的一半多1个,第十天的时候发现只剩下一个
  3. // 求第一天的桃子数量
  4. func peach(n int) int {
  5. if n > 10 || n < 1 {
  6. fmt.Println("您输入的天数不对")
  7. return 0
  8. }
  9. if n == 10 {
  10. return 1
  11. } else {
  12. return (peach(n+1) + 1) * 2
  13. }
  14. }
  15. fmt.Println("第1天的桃子数量", peach(1))
  16. // 第1天的桃子数量 1534