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取地址并打印,运行结果如下:

C++递归使用

根据程序运行的结果来看,递归实际就是压栈出栈的过程,何时压栈何时出栈取决于边界条件的制定,因此当递归缺少边界条件时程序与无限调用,直至当前程序栈全部耗尽,运行强制停止!

C++递归使用

我们稍微复杂下,因为当一项工作不断分为两项比较小且类似的工作时,递归的递归的递归的......就是非常好用的一种算法。我们假设有这样一个问题“将刻度尺切割对半并读取切割处的值,在平分刻度尺后在左端和右端继续切割并读值,依次类推”,来看下面的这段代码:

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;//递归返回

}

我们来看运行结果:

C++递归使用

从程序结果可以看出,递归运行时,函数自身将不断调用两个函数自身,形似二叉树的延申过程,同上所述递归经常用于边界与过程都已知的重复计算,类如斐波那契数列,阶乘,网页的前进与返回,arxml,cdd数据库解析等;对了,需要注意一点的是C中main函数自身可以递归,但是C++中不行。好啦,本次递归的原理就说到这里,文中如有错误请各路大佬指点,感兴趣的可以阅读其他更加深入的大佬文章~



原文链接: https://www.cnblogs.com/YiMo9929/p/16600331.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/5787

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月4日 下午7:51
下一篇 2023年2月4日 下午7:52

相关推荐