C++递归使用
首先来谈谈常规的递归概念,递归递归先递后归。指的是我问你,你问他,他问下一个人这样层层递进直到得知结果并返回的过程。因此递归作为一种算法在程序设计语中广泛应用。 绕口一点来说递归就是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。最基本的递归结构如下:
void countdown(int n) { cout << "n is " << n << " addr: "<<&n<< endl; if (n) //边界条件:终止递归的条件 countdown(n-1);//前进段:递归终止条件不满足时 cout << "n is " << n << " addr: " << &n << endl; //返回段:递归终止条件满足时 }
为了更加深刻的理解递归的过程,我们给传递的变量n取地址并打印,运行结果如下:
根据程序运行的结果来看,递归实际就是压栈出栈的过程,何时压栈何时出栈取决于边界条件的制定,因此当递归缺少边界条件时程序与无限调用,直至当前程序栈全部耗尽,运行强制停止!
我们稍微复杂下,因为当一项工作不断分为两项比较小且类似的工作时,递归的递归的递归的......就是非常好用的一种算法。我们假设有这样一个问题“将刻度尺切割对半并读取切割处的值,在平分刻度尺后在左端和右端继续切割并读值,依次类推”,来看下面的这段代码:
void cut_ruler(double start,double end) { double middle_value = (start + end) / 2; double light_start, light_end; double right_start, right_end; light_start = start;//获取左端的起始值 light_end = middle_value;//获取左端的结束值 right_start = middle_value;//获取右端的起始值 right_end = end;//获取右端的结束值 cout << "the light_start:" << light_start << endl; cout << "the light_end:" << light_end << endl; cout << "the right_start:" << right_start << endl; cout << "the right_end:" << right_end << endl; cout << "the middle:" << middle_value << endl; cout << endl; if ((end-start) > 1)//终止条件 { cut_ruler(light_start, light_end);//左边值,递归前进 cut_ruler(right_start, right_end);//右边值,递归前进 } cout << "the middle return:" << middle_value << endl;//递归返回 }
我们来看运行结果:
从程序结果可以看出,递归运行时,函数自身将不断调用两个函数自身,形似二叉树的延申过程,同上所述递归经常用于边界与过程都已知的重复计算,类如斐波那契数列,阶乘,网页的前进与返回,arxml,cdd数据库解析等;对了,需要注意一点的是C中main函数自身可以递归,但是C++中不行。好啦,本次递归的原理就说到这里,文中如有错误请各路大佬指点,感兴趣的可以阅读其他更加深入的大佬文章~
本文来自博客园,作者:{张一默},转载请注明原文链接:https://www.cnblogs.com/YiMo9929/p/16600331.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了