GO语言基础教程(87)Go函数之递归函数:当函数“套娃”时:GO语言递归函数全解析,看完别再说你搞不懂递归!

第一部分:递归是什么?从生活中的“套娃”说起

朋友们,今天咱们来聊聊Go语言中一个让人又爱又恨的特性——递归函数。啥是递归?简单来说,就是函数自己调用自己,就像俄罗斯套娃一样,一层套一层,直到最小的那个娃娃。

想象一下这个场景:你站在两面平行的镜子之间,看到的镜像无限延伸,这就是递归的视觉效果。再比如,你小时候听过的那个故事:“从前有座山,山上有座庙,庙里有个老和尚在讲故事:从前有座山…”这也是递归,虽然是个无限递归(也就是我们常说的死循环)。

在编程中,递归是一种解决问题的方法,它把一个问题分解为与原问题相似但规模更小的子问题,直到子问题可以直接解决。递归的核心思想是:通过解决小问题来解决大问题

那么,递归函数在什么情况下使用最合适呢?一般来说,当一个问题满足以下条件时,递归就是个不错的选择:

  1. 问题可以分解为规模更小的同类问题
  2. 最小规模的问题有直接解
  3. 子问题的解可以组合成原问题的解

在Go语言中,递归函数与其他函数没有语法上的区别,只是在函数体内部调用了自身。听起来简单,但这里面可是藏着不少学问和陷阱,接下来就让我带大家深入探索。

第二部分:Go语言中的递归函数基础写法

在Go语言中写递归函数,其实和写普通函数差不多,关键在于要设置好递归条件基线条件

基线条件(Base Case):这是递归的终止条件,没有它递归就会无限进行下去,最终导致栈溢出错误。就像套娃总得有个最小的,不能无限套下去。

递归条件(Recursive Case):这是函数调用自身的部分,每次调用都应该使问题规模减小,逐步逼近基线条件。

让我们从一个最简单的例子开始——计算阶乘:

package main

import "fmt"

// 计算n的阶乘
func factorial(n int) int {
    // 基线条件:0的阶乘是1
    if n == 0 {
        return 1
    }
    // 递归条件:n! = n * (n-1)!
    return n * factorial(n-1)
}

func main() {
    fmt.Printf("5的阶乘是:%d\n", factorial(5)) // 输出:120
    fmt.Printf("0的阶乘是:%d\n", factorial(0)) // 输出:1
    
    // 我们来分解一下factorial(5)的计算过程:
    // factorial(5) = 5 * factorial(4)
    //              = 5 * 4 * factorial(3)
    //              = 5 * 4 * 3 * factorial(2)
    //              = 5 * 4 * 3 * 2 * factorial(1)
    //              = 5 * 4 * 3 * 2 * 1 * factorial(0)
    //              = 5 * 4 * 3 * 2 * 1 * 1
    //              = 120
}

看到没?递归其实就是把大问题拆成小问题。计算5的阶乘,不知道5×4×3×2×1是多少,但知道5×4!是多少,就这样一层层拆解,直到0!这个已知答案。

再来看一个经典的斐波那契数列例子:

package main

import "fmt"

// 计算第n个斐波那契数
func fibonacci(n int) int {
    // 基线条件
    if n <= 1 {
        return n
    }
    // 递归条件:F(n) = F(n-1) + F(n-2)
    return fibonacci(n-1) + fibonacci(n-2)
}

func main() {
    fmt.Println("斐波那契数列前10项:")
    for i := 0; i < 10; i++ {
        fmt.Printf("F(%d) = %d\n", i, fibonacci(i))
    }
    
    // 输出:
    // F(0) = 0
    // F(1) = 1  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值