学了一段时间的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 mainimport "fmt"func main() {var n float32 = 5result1 := fibonacciRecursively(n)fmt.Println(result1)
}//普通递归方式
func fibonacciRecursively(n float32) float32 {if n < 3 {return 1}return fibonacciRecursively(n-1) + fibonacciRecursively(n-2)
}

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

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

package mainimport "fmt"func main() {var n float32 = 5result2 := 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 }

转载于:https://www.cnblogs.com/yejg1212/archive/2013/03/30/2991133.html

Go语言学习(七)-----练练笔之递归相关推荐

  1. 【C语言学习记录01】使用递归实现十进制转二进制

    前言 我本人也在慢慢学习C语言,看的是C Primer Plus这本书,为了激励自己学习下去,所以会慢慢发分享一些学习心得,也当是记录一下吧,以后也好回顾回顾,本人很菜,高手们不要嘲笑,有问题欢迎指点 ...

  2. SQL语言之DQL语言学习(七)分组查询

    语法 select分组函数,列(要求出现在group by的后面) from 表 where 筛选 group by 分组列表 order by 排序子句 案例一: 查询每个工种的最高工资 SELEC ...

  3. c语言第七章函数笔记,我的C语学习笔记-C语言教程(七).doc

    我的C语学习笔记- C语言教程(七) C语言教程---第一章: C语言概论 C语言教程---第二章: 数据类型.运算符.表达式 C语言教程---第三章: C语言程序设计初步 C语言教程---第四章: ...

  4. C语言学习-翁凯(第七章笔记)

    C语言学习-翁凯(第七章笔记) 第七章 7.1.1初见函数 素数求和 int m,n;int i;int cnt=0;int sum=0;scanf("%d %d",&m, ...

  5. c语言第七章作业,C语言学习第七章

    今天开始学习指针,指针在C语言中具有很重要的地位,按照老师所说,学C学不好指针跟没学一样,可见指针在C语言中的重要地位.废话不多说,首先我们先要知道什么是指针. 指针:指针是一个变量,它存储另一个对象 ...

  6. springcloud学习(七)-Sidecar(多语言支持)

    title: springcloud学习(七)-Sidecar(多语言支持) date: 2021-1-28 tags: 微服务 springcloud学习(七)-Sidecar(多语言支持) spr ...

  7. c语言实验七实验报告,C语言实验七 数 实验报告.doc

    C语言实验七 数 实验报告 C语言程序设计 实 验 报 告 实验题目 实验七 函数 实验目的 掌握函数定义的方法: 掌握函数实参与形参的对应关系,以及值传递的方式. 掌握函数的嵌套调用和递归调用的方法 ...

  8. c语言实验七 函数实验报告,C语言实验七函数实验报告.doc

    C语言实验七函数实验报告 C语言程序设计 实 验 报 告 实验题目 实验七 函数 实验目的 掌握函数定义的方法: 掌握函数实参与形参的对应关系,以及值传递的方式. 掌握函数的嵌套调用和递归调用的方法: ...

  9. 【Go语言 · 学习笔记】

    文章目录 Go语言 · 学习笔记 一.Go包管理 1. 什么是Go语言中的包 2. 包的命名 3. main包 4. 导入包 5. 远程包导入 6. 命名导入 7. 包的init函数 二.Go开发工具 ...

最新文章

  1. suse linux 10 下安装sybase15.0.3,SUSE10下安装sybase ASE15.0
  2. 为Ubuntu设置新的软件源
  3. Leetcode题库 144.二叉树的前序遍历(递归 C实现)
  4. java电信计费项目论文_基于JAVA开发的电信IP计费系统设计毕业论文
  5. 【POJ - 2318】TOYS(计算几何,叉积判断点与直线位置关系,二分)
  6. httpservlet获取请求端IP地址
  7. Spark Worker源码
  8. 结构化数据抽取成三元组_干货丨AI在数据防泄漏中的应用——知识图谱之知识抽取...
  9. idea war包和jar包区别 以及用maven如何打包
  10. HDU2149 Public Sale【巴什博弈】
  11. python语言程序设计 陈东_清华大学出版社-图书详情-《Python语言程序设计》
  12. HTML5_2(视频)
  13. Java自动化测试系列[v1.0.1][PO设计模式]
  14. 学习Python爬虫有哪些书籍书籍?看这几本书就够了
  15. Beagleboneblack 中DDS模块驱动源码(AD9833)
  16. pythonsdk_Python SDK下载
  17. 深度学习:BERT模型
  18. 佳能打印机无法确认打印机与计算机连接,安装打印机驱动时提示确认打印机已连接电脑的问题分析及解决办法...
  19. unity3d 取锚点位置_加热炉传输点
  20. vue限制只能输数字

热门文章

  1. 54 Django 模型层(1) 单表查询
  2. (2016北京集训十二)【xsy1542】疯狂求导
  3. 2018最新手机号正则
  4. 课时21:函数:lambda表达式
  5. MySQL存储过程和函数(一)
  6. hadoop整合纪要
  7. Java复习(二)类与对象的基本概念
  8. Mongodb 与 Redis 调教
  9. 批量修改dos文件到unix
  10. XLT格式化XML那点事(C#代码中的问题解决)(二)