首页 > 其他分享 >递归函数就这么简单!通俗的Go语言递归指南

递归函数就这么简单!通俗的Go语言递归指南

时间:2024-02-29 09:34:08浏览次数:23  
标签:return 递归 递归函数 factorial 阶乘 uint Go

/ Go 语言递归函数 /

递归是一种很重要的编程技巧,可以用简洁的代码解决许多问题。Go 语言同样支持递归函数。本文将通过示例讲解递归函数的用法。本文主要内容如下

  1. 什么是递归函数

  2. 递归函数工作原理

  3. 递归函数结构解析

  4. 示例 1 - 阶乘计算

  5. 示例 2 - 斐波那契数列

  6. 递归函数与迭代函数

  7. 递归函数的优缺点

  8. 递归函数使用注意事项

  9. 递归函数应用场景

  10. 递归函数实现机制

1

   

一、什么是递归函数

递归函数指的是在函数定义中调用自己的一种函数。

例如计算阶乘的递归函数:

func factorial(n uint) uint {  if n == 0 { // 递归终止条件    return 1  }  return n * factorial(n-1) // 调用自身}

factorial 通过调用自身计算 n 的阶乘。

2

   

二、递归函数工作原理

递归函数的一般工作原理:

  1. 检查递归终止条件

  2. 递归调用自身解决规模更小的子问题

  3. 合并子问题的解到原问题

这与数学归纳法非常类似。

3

   

三、递归函数结构解析

一个递归函数需要同时具备:

  • 递归终止条件(base case)

  • 递归调用自身(recursive call)

如果缺少任一部分,递归函数将无法正常工作。

4

   

四、示例 1 - 阶乘计算

计算 n 的阶乘:

func factorial(n uint) uint {  if n == 0 { // 递归终止条件    return 1   }
return n * factorial(n-1) // 递归调用}

测试:

fmt.Println(factorial(5)) // 输出120

factorial 通过调用自身计算较小的阶乘,逐步推到 n=0 的终止条件,非常简洁。

5

   

五、示例 2 - 斐波那契数列

使用递归求取斐波那契数列:

func fib(n int) int {  if n == 0 { // 递归终止    return 0  }  if n == 1 {     return 1  }  return fib(n-1) + fib(n-2) // 递归调用}

测试:

fmt.Println(fib(5)) // 输出5

同样通过子问题求解整体问题,推到已知的终止条件。

6

   

六、递归函数与迭代函数

递归函数和迭代函数可以相互转换:

阶乘递归函数:

func factorial(n uint) uint {  // 递归求解  }

等效迭代函数:

func factorial(n uint) uint {  var res = 1  for i := 1; i <= n; i++ {    res *= i  }  return res }

两者本质上是解决同类型问题的不同方法。

7

   

七、递归函数的优缺点

递归函数的优缺点:

优点:

  • 简洁易读,代码量少

  • 数学归纳思维直观

  • 可优雅解决分治法类问题

缺点:

  • 性能和空间效率较差

  • 调试和测试较困难

  • 容易栈溢出

8

   

八、递归函数使用注意事项

使用递归需要注意:

  • 正确设置递归终止条件,避免无限递归

  • 控制最大递归深度,通常设置为 500 以内

  • 合理使用缓存,避免重复递归计算结果

9

   

九、递归函数应用场景

递归函数在以下场景中非常实用:

  • 各类数学问题,如阶乘、斐波那契数列、汉诺塔

  • 图与树的遍历搜索算法

  • 排序算法如快速排序、归并排序

  • 分治法类的算法

  • 回溯类问题,如 N 皇后、解密

  • 逆向推导某结果的过程

等等。

10

   

十、递归函数实现机制

递归函数通过系统栈实现。每递归一次就将一个栈帧压入栈,递归返回后弹出,类似:

factorial(5)  |factorial(4)  |factorial(3)   |...  |  factorial(1) // 终止条件

递归深度即是栈的深度。

11

   

总结

递归是一种常见和实用的编程技巧,Go 语言也对其进行了支持。

正确使用递归函数可以简化代码,提高问题求解的效率。

标签:return,递归,递归函数,factorial,阶乘,uint,Go
From: https://www.cnblogs.com/cheyunhua/p/18042699

相关文章

  • 使用 Python 的 Django 框架开发一套 Web API 项目 All In One
    使用Python的Django框架开发一套WebAPI项目AllInOne游戏广告WebAPIDjango项目vsDjango应用程序一个Project可以包含多个Appsporject是一个可以独立运行的软件包app的运行必须依赖projectapp可以作为可以复用的功能模块使用demosDRF,DjangoR......
  • Go语言精进之路读书笔记第38条——尽量优化反复出现的if err != nil
    Go在最初设计时就有意识地选择了使用显式错误结果和显式错误检查38.1两种观点显式的错误处理方式让Go程序员首先考虑失败情况,这将引导Go程序员在编写代码时处理故障,而不是在程序部署并运行在生产环境后再处理。而为反复出现的代码片段iferr!=nil{...}所付出的成本已基本被......
  • (蓝桥)递归与递推
    1、对于 scanf printf和cincout按照10^5来划分使用 递归实现指数型枚举 https://www.acwing.com/problem/content/94/ #include<iostream>#include<cstring>#include<cstdio>#include<algorithm>usingnamespacestd;constintN=17;intn;inta[N];......
  • 软件性能测试工具RunnerGo安装步骤
    现在安装RunnerGo仅需要一条命令!目前支持系统:Centos、Debian、Ubuntu三种。下面给大家介绍一下RunnerGo安装使用流程:Step1:复制以下命令wget https://img.cdn.apipost.cn/running_go/img/wiki/runnergo.tar&&tarxf runnergo.tar  &&bashinstall.shStep2:选择安装系统......
  • golang中关于map的value类型定义为函数类型时(方法值)的一点点思考
    文章的内容仅仅是自己关于map的value类型定义为函数类型时的一点点思考,如有不对的地方,请不吝赐教。学习过后才知道叫做方法值。1、起因最近在看老项目代码时,看到了一段类似于下面的定义,最开始看到的时候,对于LotMap的用法比较疑惑,为什么mapvalue定义的函数类型是func(r......
  • 【rust】《 Rust安装并配置cargo国内源(提供rust编译器) 》
    下载Rust安装程序官网地址:https://www.rust-lang.org/tools/installWindow直接点击DownloadRustup-init.exe就可以下载运行程序。运行安装程序双击下载的rustup-init.exe程序,此时会弹出命令窗口命令窗口内输入1  ;1表示默认形式安装,Rust的环境变量会自动添加到系统......
  • 2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系, “y下“和“y上“表示一条无限延伸
    2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系,"y下"和"y上"表示一条无限延伸的道路,"y下"表示这个道路的下限,"y上"表示这个道路的上限,给定一批长方形,每一个长方形有(x1,x2,y1,y2),4个坐标可以表示一个长方形,判断这条道路整体是不是可以走通的。以下为正式题目:图片在计算......
  • Python如何递归删除空文件夹
    1.Python如何递归删除空文件夹,这个问题很常见。但大多数人的解决办法都是自己实现递归函数解决这个问题,其实根本不用那么麻烦。Python中的os.walk提供了一种从内到外的遍历目录树的方法(设置topdown=False),这样由内到外判断当前目录树下是否有文件和文件夹,如果都没有则意味着当前目......
  • L-BFGS-B(Limited-memory Broyden–Fletcher–Goldfarb–Shanno )算法理解 —— 内存
    本文主要讲下个人对数值优化算法中几种常见算法的理解。什么是优化算法?给出函数f(X),现在要求minf(X)时的X值,这就是最优化问题。1.共轭梯度法方程:A*x=b,A矩阵为对称正定矩阵,b为向量,目标为求解出向量x。个人认为共轭梯度法并不能被当做是一个真正的优化算法,因为共轭梯度......
  • P5461【黄】-递归
    简单的很,十分钟不到就切掉了,做这道黄题是因为今天写累了不想写代码了,就最后做一道简单的。看来黄题对我而言基本就是“一半能切一半想一会之后能切”,除非题目是思维题 1#include<iostream>2#include<cstring>3#include<string>4#include<cstdio>5#include......