• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go语言学习(七)-----练练笔之递归

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

学了一段时间的Go语言了,今天来见识下Go语言写的递归程序。

先来做个经典题题目:

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

分析

有以下数学表达式:

Y1=X2+X3 ,Y2=X1 ,Y3=X2+X3

Z1=Y2+Y3 ,Z2=Y1 ,Z3=Y2+Y3

Z1+Z2+Z3= Y2+Y3+Y1+(Y2+Y3)=(Y2+Y3+Y1)+(X2+X3+X1)

因此上面每个月的兔子的数量满足斐波那契数列。斐波那契数列,那就easy了~~

package main

import "fmt"

func main() {
	var n float32 = 5
	result1 := fibonacciRecursively(n)
	fmt.Println(result1)
}

//普通递归方式
func fibonacciRecursively(n float32) float32 {
	if n < 3 {
		return 1
	}

	return fibonacciRecursively(n-1) + fibonacciRecursively(n-2)
}

嗯,至此,问题就解决了,不过后来发现,还有一种“尾递归”的做法。  

下面换用尾递归来实现上面的斐波纳契数列:

package main

import "fmt"

func main() {
    var n float32 = 5

    result2 := fibonacciTailRecursively(5, 1, 1)
    fmt.Println(result2)
}


//尾递归方式
func fibonacciTailRecursively(n float32, acc1 float32, acc2 float32) float32 {
    if n == 1 {
        return acc1
    }

    return fibonacciTailRecursively(n-1, acc2, acc1+acc2)
}

使用尾递归,速度确实快了很多。

 

————————————————摘自百度百科——————————

尾递归是极其重要的,不用尾递归,函数的堆栈耗用难以估量,需要保存很多中间函数的堆栈。比如f(n, sum) = f(n-1) + value(n) + sum; 会保存n个函数调用堆栈,而使用尾递归f(n, sum) = f(n-1, sum+value(n)); 这样则只保留后一个函数堆栈即可,之前的可优化删去。

尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量. 直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去.

————————————————摘自百度百科———————————

 

再来一个阶乘的尾递归实现Go语言版:

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     var n float32 = 6
 7     fmt.Println(factorialRecursively(n))
 8     fmt.Println(factorialTailRecursively(n,1))
 9 }
10 
11 //普通递归
12 func factorialRecursively(n float32) float32 {
13     if n == 1 {
14         return 1
15     }
16 
17     return n * factorialRecursively(n-1)
18 }
19 
20 //尾递归
21 func factorialTailRecursively(n float32, acc float32) float32 {
22     //0!=1,1!=1,所以这里判断n==0或者n==1都对。
23     if n == 0 {
24         return acc
25     }
26 
27     return factorialTailRecursively(n-1, acc*n)
28 }

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go语言 gin框架学习笔记(二)之 简单传参发布时间:2022-07-10
下一篇:
【转】go中struct初始化的3种方式发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap