c语言中什么是递归?经典递归函数例子分享

c语言中什么是递归?下面本篇文章就来带大家通过经典递归函数例子来了解一下c语言中的递归,希望对大家有所帮助!

c语言中什么是递归?经典递归函数例子分享

递归就是一个过程或 函数 在其定义或说明中有直接或间接调用自身的一种方法;递归函数就是直接或间接调用自身的函数,也就是自身调用自己的过程。

刚接触递归的同学,可能难以理解递归,难以理解的点可能很多,例如:

函数为什么可以在自己的内部又调用自己呢?

立即学习“C语言免费学习笔记(深入)”;

既然可以自己调用自己,那么递归运行过程中一定回有很多层相互嵌套,到底什么时候不再嵌套呢?

递归运行过程中,相互嵌套的多层之间会有参数传递,多层之间是否会相互影响?

递归两个要素

递归边界

递归的逻辑——递归”公式”

递归的过程一定有参数的变化,并且参数的变化,和递归边界有关系.

在难度较大的题目中,这两者均不容易直接得到.

递归的种种问题,也许理解的同学可能可以用一句话解释清楚,但是不理解的同学再怎么说也没办法理解.

下面通过几个简单的例子【体会】一下递归,先从【感性】的角度理解递归.

1.Fibonacci数

我们直到Fibonacci数的递推公式为:F(0)=F(1)=1,F(n)=F(n-1)+F(n-2) n>=2;

这个明显地给出了递归边界n=0或1的时候F(n)的值,和递归逻辑F(n)=F(n-1)+F(n-2),即递推公式.所以这个递归函数不难书写

#includeusing namespace std;int F(int n)//函数返回一个数对应的Fibonacci数{ if(n0 || n1)//递归边界return 1; return F(n-1) + F(n-2);//递归公式}int main(){ //测试int n; while(cin >> n) cout << F(n) << endl;return 0;}

2.阶乘的递归公式:n*F(n-1)

代码如下:

#includeusing namespace std;int F(int n){ if(n==0)//递归边界return 1;return n*F(n-1);//递归公式}int main(){ int n; cin >> n; cout << F(n) << endl;return 0;}

3.数组求和

给一个数组a[]:a[0],a[1],…,a[n-1]如何用递归的方式求和?

仍然是两个问题:递归边界和递归公式.

递归边界是什么?一时不容易想到,但是我们想到了求和,多个数的求和过程是什么,x,y,z,w手动求和的过程是什么?步骤如下:

x+y=a,任务变为a,z,w求和

a+z=b,任务变为b,w求和

b+w=c得出答案

思考一下,【得出答案】这一步为什么就可以得出答案呢?(废话?)是因为,一个数不用相加就能得出答案.

所以,递归的边界就是只有一个数.

所以,递归边界有了,那么递归公式呢?其实手动计算过程中,隐含了递归公式:

其中+为求两个数的和,F为求多个数的和的递归函数.代码如下:

#includeusing namespace std;int F(int a[],int start,int end){ if(start==end)//递归边界return a[start];return a[start] + F(a,start+1,end);//递归公式}int main(){ int a[] = {1,2,3,4,5}; int s=0,e=4; cout << F(a,s,e) << endl;return 0;}

4.求数组元素最大值

手动求最大值的过程是什么,遍历+比较,过程如下:

例如,求3,2,6,7,2,4的最大值:先设置最大值max=-999999,然后将max和数组元素逐个(遍历)比较如果a[i]>max,则更新max的值为a[i],否则max不变,继续向后遍历,直到遍历结束.

max

max>2,max=3不变

max

max

max>2,max=7不变

max>4,max=7不变

遍历结束,max=7为最大值.

和求和类似,递归的公式如下:

其中max为求两个数的较大值函数,F为求多个数的最大值的递归函数.代码如下:

#includeusing namespace std;#define max(a,b) (a>b?a:b)int F(int a[],int s,int e){ if(s==e) return a[s]; else if(s+1 == e)//递归边界return max(a[s],a[e]);return max(a[s],F(a,s+1,e));//递归公式!!!}int main(){ int a[] = {5,1,4,6,2}; int s = 0,e = 4; cout << F(a,s,e) << endl;return 0;}

之所以,说上面的几个例子是【简单例子】,是因为上述所有的递归都属于【单向递归】.单向递归,递归的路径就是一个方向,所以思路相对比较容易想到.

较难的递归问题,一般都不是单向递归,而是需要使用【回溯】的方法,递归的方法不太容易想到.

以上就是c语言中什么是递归?经典递归函数例子分享的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1433874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 09:34:06
下一篇 2025年12月17日 09:34:35

相关推荐

  • XML中如何获取节点路径字符串_XML获取节点路径字符串的操作方法

    答案:获取XML节点路径需根据语言和库选择方法。Python的lxml库可用getpath()直接获取;Java需手动遍历DOM树并计算兄弟节点位置生成XPath;JavaScript可通过递归函数构建路径,统计同名兄弟节点索引;路径是否含索引、属性节点表示及命名空间处理需注意,频繁调用影响性能,应…

    2025年12月17日
    000
  • XML中如何解析多层嵌套_XML解析多层嵌套XML节点的方法

    解析多层嵌套XML需逐层定位节点,常用DOM、SAX或ElementTree;DOM适合小中型文件,将XML转为树形结构,通过getElementsByTagName遍历节点;Python推荐ElementTree,用ET.parse()加载文件,root.find()支持XPath语法快速定位深层…

    2025年12月17日
    000
  • XML中如何遍历XML树_XML遍历XML树的操作技巧

    答案:使用Python的ElementTree模块可高效遍历XML树,通过iter()全量扫描或find()/findall()按层级查找节点,结合递归函数处理复杂结构,并注意文本清理、存在性检查及内存优化,适用于各类XML数据解析任务。 在处理XML数据时,遍历XML树是常见的操作。它可以帮助我们…

    2025年12月17日
    000
  • XML中如何解析多层嵌套XML_XML解析多层嵌套XML的详细方法

    解析多层嵌套XML需根据文件大小和结构选择DOM、SAX或ElementTree等方法,逐层提取数据。 解析多层嵌套的XML文件,关键在于理解其层级结构,并选择合适的解析方式逐层读取数据。常用的方法包括DOM、SAX和使用第三方库如ElementTree(Python)或Jsoup(Java)。下面…

    2025年12月17日
    000
  • 如何在Golang中获取嵌套结构体类型_分析复杂类型层次

    在 Go 中获取嵌套结构体类型信息需用 reflect 包递归解析:先用 reflect.TypeOf 获取顶层类型,对每个字段调用 Field(i).Type,遇 struct 则继续遍历,指针等需 Elem() 解包,未导出字段不可见。 在 Go 中获取嵌套结构体的类型信息,核心是借助 refl…

    2025年12月17日
    000
  • 如何提高Golang函数调用效率_使用内联函数和减少闭包开销

    Go编译器自动内联函数,简短无复杂控制流的函数更易被内联;闭包开销小,但频繁创建、逃逸到堆或捕获大变量会显著影响性能。 Go 编译器会在合适时自动内联函数,但开发者可以通过规范写法和避免特定模式来提升内联成功率,从而减少调用开销;闭包本身不慢,但频繁创建、逃逸到堆上或捕获大变量会显著拖慢性能。 让编…

    2025年12月17日
    000
  • Go语言与尾调用优化:现状、影响及开发实践

    go语言的官方编译器(gc)目前不实现尾调用优化(tco),并且未来也没有明确计划将其纳入语言规范或编译器实现中。这意味着在go中编写递归函数时,开发者不应依赖tco来避免栈溢出或提高性能,而应优先考虑迭代或其他非递归解决方案,以确保程序的健壮性和效率。 深入理解尾调用优化(TCO) 尾调用优化(T…

    2025年12月16日
    000
  • Go语言与尾调用优化:深入理解其现状与影响

    go语言的官方编译器(gc)目前不实现尾调用优化(tco)。这意味着在go中,递归函数,特别是尾递归,不会被编译器转换为迭代形式,可能导致栈溢出风险。开发者在设计递归算法时需注意此限制,并考虑手动迭代或优化算法以避免深度递归。 什么是尾调用优化(TCO)? 尾调用优化(Tail Call Optim…

    2025年12月16日
    000
  • Go语言中的尾调用优化:官方立场与开发实践

    本文深入探讨了Go语言标准编译器(gc)对尾调用优化的支持情况。根据官方声明,Go语言目前不计划实现尾调用优化,这对于设计深度递归函数时的性能和栈空间管理具有重要意义。文章将解析尾调用优化的概念、Go的官方立场及其对Go开发者编写递归函数的影响,并提供相应的实践建议。 什么是尾调用优化(TCO)? …

    2025年12月16日
    000
  • 深入理解Go语言中的尾调用优化:现状、影响与实践建议

    go语言的官方编译器(gc)目前不支持尾调用优化(tco),并且在可预见的未来也没有引入此功能的计划。这意味着在go中编写深度递归函数时,开发者必须关注栈空间的使用,以避免潜在的栈溢出问题。文章将探讨tco的概念、go语言对此的态度及其对并发编程的影响,并提供相应的编程实践建议。 尾调用优化(TCO…

    2025年12月16日
    000
  • Go语言与尾调用优化:深入解析其实现现状与考量

    Go语言的官方编译器(gc)目前不支持尾调用优化(TCO),并且短期内没有引入此特性的计划。这意味着在Go中,递归函数的深度可能受限于栈空间,开发者需要注意潜在的栈溢出问题,并考虑使用迭代或其他非递归方式重构代码以提高效率和稳定性。 在函数式编程语言中,尾调用优化(Tail Call Optimiz…

    2025年12月16日
    000
  • Golang如何通过反射遍历切片元素_Golang 切片元素遍历实践

    答案:Golang通过反射遍历切片需先用reflect.ValueOf获取切片的Value,验证其Kind为Slice且非nil,再通过Len()和Index(i)遍历元素,结合Interface()获取实际值;处理不同类型时可用switch判断Kind,对结构体或嵌套切片可递归处理;空切片Len为…

    2025年12月16日
    000
  • 如何在Golang中通过反射获取字段tag_Golang 字段tag获取实践

    答案:Golang反射获取结构体字段标签的核心优势在于实现配置与逻辑解耦、提升动态性与扩展性。通过将元数据直接嵌入结构体字段标签,可在运行时动态解析JSON、数据库映射、验证规则等行为,广泛应用于ORM、序列化、参数绑定等场景,减少重复代码,提升代码可读性与自文档化程度,成为众多框架实现自动化处理的…

    2025年12月16日
    000
  • Golang如何实现反射遍历嵌套结构体_Golang 嵌套结构体遍历实践

    答案:通过reflect包递归遍历结构体字段,处理指针需先判断nil再解引用,接口类型用Elem()获取底层值,非导出字段可读不可改,常见于ORM、配置解析等场景,性能开销可通过缓存优化。 在Golang中,要实现反射遍历嵌套结构体,核心在于利用reflect包递归地检查结构体字段的类型。当遇到一个…

    2025年12月16日
    000
  • Golang如何使用reflect处理interface类型_Golang reflect interface处理实践

    答案是深入理解Go的reflect包需掌握其通过TypeOf和ValueOf解析interface{}的底层机制,即利用类型描述符和数据指针分离的两字结构,结合reflect.Type与reflect.Value实现对值的动态访问与修改;实践中必须注意可设置性(CanSet)、Elem()解引用、n…

    2025年12月16日
    000
  • Go语言归并排序深度解析:避免栈溢出与正确实现指南

    本文深入探讨go语言中归并排序的正确实现方法,重点分析了常见的栈溢出问题,并提供了基于索引和切片两种优化方案的详细代码示例。通过理解归并排序的递归逻辑和合并操作,读者将能有效避免性能陷阱,实现高效稳定的排序算法。 归并排序概述 归并排序(Merge Sort)是一种高效、稳定的排序算法,其核心思想是…

    2025年12月16日
    000
  • Go语言归并排序实现与栈溢出问题深度解析

    本文深入探讨了在go语言中实现归并排序时可能遇到的栈溢出问题,尤其聚焦于递归函数中中点索引计算的常见错误。文章详细分析了问题根源,并提供了两种有效的解决方案:一种是修正基于索引的中点计算逻辑,另一种是利用go语言的切片特性简化函数签名。通过示例代码和最佳实践,旨在帮助开发者正确、高效地实现归并排序算…

    2025年12月16日
    000
  • Go语言归并排序教程:避免递归栈溢出与正确实现

    本教程深入探讨了在go语言中实现归并排序时常见的递归栈溢出问题,其根源在于递归函数中错误的中间索引计算。文章将详细分析错误原因,并提供两种解决方案:一是通过精确计算子数组的中间索引来修正递归逻辑;二是通过切片操作来简化递归调用。同时,教程还包含了完整的go语言归并排序实现代码,并讨论了相关的性能考量…

    2025年12月16日
    000
  • Go语言归并排序实现指南:解决递归栈溢出问题

    本文深入探讨go语言中归并排序(merge sort)的实现细节,重点分析了在使用`first`和`last`索引进行分治时,计算中间索引`mid`的常见错误及其导致的递归栈溢出问题。通过提供正确的`mergesort`和`merge`函数实现,并结合clrs伪代码的原理,文章旨在帮助开发者在go语…

    2025年12月16日
    000
  • Go语言中正则表达式解析树的获取与遍历

    本文深入探讨go语言`regexp/syntax`包,演示如何获取并遍历正则表达式的抽象语法树(ast)。我们将解析`syntax.parse`函数的返回值`*syntax.regexp`结构体,重点介绍其`op`、`rune`和`sub`字段,并通过递归函数展示如何逐层访问和分析正则表达式的内部结…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信