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语言学习笔记来源:尚硅谷视频课程递归