Go语言学习笔记 —— 函数调用机制解析

package main

import (
   "fmt"
)

func main01()  {
   /*
   return 语句
   基本语法:
   Go函数支持返回多个值,这一点是其它的语言没有的。
   func 函数名 (形参列表) (返回值类型列表){
      语句...
      return 返回值列表
   }


   1.若是返回值多个值时,在接收时,但愿忽略某个返回值,则使用_符号表示占位忽略。
   2.若是返回值只有一个,(返回值类型列表),能够不写()


    */
   // 调用test
   n1 := 10
   test01(n1)
   fmt.Println("n1 = ",n1) // 输出结果


}

// 一个函数test

func test01(n1 int){
   n1 = n1 + 1
   fmt.Println("n1",n1)
}

/*函数 - 递归调用
基本介绍
一个函数在函数体内又调用了自己,称为递归调用。

堆栈----先进后出


 */

func test02(n int)  {
   if n > 2{
      n--
      test02(n)
   }
   fmt.Println("n = ",n)
}

func test03(n int)  {
   if n > 2{
      n-- // 递归必须向退出递归条件接近,不然就会变成死循环。
      test02(n)
   }else{
      fmt.Println("n = ",n)
   }

}

func main02()  {

   fmt.Println("test01的输出结果:")
   test01(4)

   fmt.Println("test02的输出结果:")
   test02(4)

   fmt.Println("test03的输出结果:")
   test03(4)



/*
函数的递归须要遵循的原则
   1.执行一个函数时,就建立一个新的受保护的独立空间(新函数栈)
   2.函数局部变量是独立的,不会相互影响。
   3.递归必须向退出递归的条件接近,不然是无限递归(死递归)
   4.当一个函数执行完毕时,或者遇到return,就会返回,遵照谁的调用,就将结果返回给谁。当函数执行完毕或者是返回时,函数自己也会被系统销毁。
 */
fmt.Println("递归函数 —————— 练习题")

/*
递归调用 —— 练习题
 */

}

// 练习题1 斐波那契数

/*


 */


func fbn(n int)  int{

   if (n == 1 || n == 2) {
      return 1
   }else{
      return  fbn(n-1) + fbn(n-2)
   }
}

func main03()  {

   res := fbn(10)
   // 测试结果
   fmt.Println("递归函数 —————— 斐波那契数")
   fmt.Println("res = ",res)

}

/*
求函数值

f(1) = 3,f(n) = 2 * f(n-1) + 1
使用递归的方式

 */

func f( n int )  int{
   if n == 1 {
      return 3
   }else {
      return  2 * f(n-1) + 1
   }
}

func main04()  {
   // 测试结果是否正确
   fmt.Println("f(1 ) = ",f(1))
   fmt.Println("f(3) = ",f(3))
   fmt.Println("f(10) = ",f(10))
}

/*
猴子吃桃子问题 —————— 使用递归方式解决

猴子吃桃问题:猴子第一天摘下若干个桃子,立即吃了一半,还不过瘾,又多吃了一个,
次日早上又将剩下的桃子吃掉一半,又多吃了一个。之后天天早上都吃前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少个桃子?

分析思路:
1.第10天只有一个桃子
2.第9天有几个桃子 = (第10天桃子数量 + 1) *2
3.规律:第n天桃子数量 peach(n) = (peach(n + 1) + 1) * 2


 */

func peach(n int) int {

   if n > 10 || n < 1{
      fmt.Println("输入的天数不对")
      return 0 // 表示没有准确的数量
   }

   if n == 10 {
      return 1
   }else{
      return (peach(n + 1) + 1) * 2
   }
}

func main()  {

   // 测试
   fmt.Println("第1天的桃子数量为:",peach(1))
   fmt.Println("第2天的桃子数量为:",peach(2))
   fmt.Println("第3天的桃子数量为:",peach(3))
   fmt.Println("第9天的桃子数量为:",peach(9))
   fmt.Println("第10天的桃子数量为:",peach(10))
   fmt.Println("第11天的桃子数量为:",peach(11))

}

函数的注意事项和细节讨论
1.函数的形参列表能够是多个,返回值列表也能够是多个数组

2.形参列表和返回值列表的数据类型能够是值类和引用类型函数

3.函数的命名遵循表示法命名规范(首字母不能是数字,首字母大写,
该函数能够被本包文件和其余的包文件使用,相似public,首字母小写,只能被本包文件使用,其余的文件不可以使用,相似private)学习

4.函数中的变量是局部的,函数外不会生效测试

5.基本数据类型和数组默认都是值传递,即进行值拷贝,在函数内修改,不会影响到原来的值。指针

6.若是但愿函数内的变量能修改函数外的变量,能够传入变量的地址& , 函数内以指针的方式操做变量,效果上相似于引用。code

7.Go中函数不支持重载视频

 

Go语言学习笔记来源:尚硅谷视频课程递归

相关文章
相关标签/搜索