《61396-Go语言程序设计项目化教程(微课版)3.3 变参与递归函数.pptx》由会员分享,可在线阅读,更多相关《61396-Go语言程序设计项目化教程(微课版)3.3 变参与递归函数.pptx(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、变参与递归函数变参与递归函数变参函数递归函数01.02.目录01变参函数变参函数含义变参函数定义格式1变参函数变参函数Go语言函数可变参数在Go语言中,函数的参数可以支持指定任意的个数与数据类型,这就是Go语言函数的可变参数最典型的可变参数就是Printf()函数Go语言虽然支持不定长变参,但是要注意不定长参数只能作为函数的最后一个参数,不能放在其他参数的前面语法格式func函数名(固定参数列表,v.T))(返回参数列表)函数体可变参数一般放在函数参数列表的末尾,也可不存在固定参数列表“v.T”代表的其实就是变量v为T类型的切片,v和T之间为三个“.”1变参函数变参函数可变参数本质Go语言中函
2、数的可变参数:必须是函数的最后一个参数这其实就是一个语法糖,效果类似于切片要在多个函数中传递可变参数,可在传递时添加“.”可变参数变量是一个包含所有参数的切片如果要将这个含有可变参数的变量传递给下一个可变参数函数,可以在传递时给可变参数变量后添加“.”,这样就可以将切片中的元素进行传递,而不是传递可变参数变量本身。packagemainimportfmtfuncsum(args.int)intsum:=0for_,arg:=rangeargssum+=argreturnsumfuncmain()fmt.Println(sum(1,2,3)fmt.Println(sum(1,2,3,4,5,6,
3、7)运行结果为:628Go语言函数可变参数,可以传入任意个数的参数这里定义了一个函数sum(),该函数的参数是可变参数。因此我们在main函数调用的时候,可以传入任意个数的参数,但所有的参数的类型必须都是int类型的。1变参函数变参函数packagemainimportfmtfuncprintStrs(args.string)for_,arg:=rangeargsfmt.Print(arg,)fmt.Println()funcmain()printStrs(Hello,Golang)printStrs(I,Love,Study)运行结果为:HelloGolangILoveStudyGo语言函数
4、可变参数,可以传入任意个数的参数这里定义了一个函数printStrs(),该函数的参数是可变参数。因此我们在main函数调用的时候,可以传入任意个数的参数,但所有的参数的类型必须都是string类型的。1变参函数变参函数在Go语言中,函数的可变参数除了可以支持指定任意的个数,还可以支持任意的数据类型。上述片段是定义了一个名为funName的函数,参数是args参数args的个数是不确定的,参数args的类型也不是确定的因此这里使用的数据类型时候接口类型,即interface。funcfunName(args.interface)函数体1变参函数变参函数1变参函数变参函数packagemaini
5、mportfmtfunchaiPrint(args.interface)for_,arg:=rangeargsswitcharg.(type)caseint:fmt.Println(arg,typeisint)casestring:fmt.Println(arg,typeisstring)caseint64:fmt.Println(arg,typeisint64)casefloat64:fmt.Println(arg,typeisfloat64)default:fmt.Println(arg,typeisunknown)funcmain()haiPrint(Hello,Golang,3,100
6、.1)运行结果为:HellotypeisstringGolangtypeisstring3typeisint100.1typeisfloat64Go语言函数可变参数,可以传入任意个数与任意类型这里定义了一个函数haiPrint,该函数的参数是可变参数,参数的个数和参数的类型都是不确定的,因此我们在main函数调用的时候,可以传入任意个数和任意类型的参数。定义一个可传递的可变参数:funcaddAll(slice.int)将addall函数的可变函数修改为切片:funcaddAll(sliceint)当想传递可变参数本身Go语言中典型的可变参数函数funcPrintln(a.any)(nint,
7、errerror)returnFprintln(os.Stdout,a.)funcPrintf(formatstring,a.any)(nint,errerror)returnFprintf(os.Stdout,format,a.)1变参函数变参函数1变参函数变参函数packagemainimportfmtfuncsum(titlestring,nums.int)varsumValueintfor_,num:=rangenumssumValue+=numfmt.Println(title,sum:,sumValue)funcmain()sum(test1,1,2)nums:=int1,2,3s
8、um(test2,nums.)运行结果为:test1sum:3test2sum:6.int表示为变参函数,在主函数中第一次调用sum函数时,传参为1,2,然后计算和;第二次传参时定义了一个切片,在第二次调用sum函数时传入了定义好的切片。02递归函数递归函数定义递归需要具备的条件递归函数的优缺点比较递归函数递归本质:在运行的过程中自己调用自己递归函数:在函数内部调用函数自身的函数常见应用场景:数字阶乘、斐波那契数列等语法格式funcrecursion()recursion()/函数调用自身2递归函数递归函数使用条件一个问题可以被拆分成多个子问题拆分前的原问题与拆分后的子问题除了数据规模不同,但
9、处理问题的思路时一样的不能无限制的调用本身,子问题需要有退出递归状态的条件2递归函数递归函数递归函数优点定义简单,逻辑清晰理论上,所有的递归函数都可以用循环的方式实现;但循环的逻辑不如递归清晰递归函数缺点函数调用是通过栈(stack)这种数据结构实现的每当进入一个函数调用,栈就会加一层栈每当函数返回,栈就会减一层由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出,需要注意防止栈溢出1变参函数变参函数packagemainimportfmtfuncFactorial(nuint64)(resultuint64)if(n0)result=n*Factorial(n-1)returnre
10、sultreturn1funcmain()variint=10fmt.Printf(%d!=%dn,i,Factorial(uint64(i)运行结果为:10!=3628800利用递归函数实现阶乘计算每一次都是乘以(当前数字-1)1变参函数变参函数packagemainimportfmtfuncfibonacci(nint)intifn2returnnreturnfibonacci(n-2)+fibonacci(n-1)funcmain()variintfori=0;i10;i+fmt.Printf(%dt,fibonacci(i)运行结果为:0112358132134Go语言的递归函数实现斐波那契数列。斐波那契数列:F(0)=0F(1)=1F(n)=F(n-1)+F(n-2)(n2,nN*)谢谢观看谢谢观看