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++中不行。好啦,本次递归的原理就说到这里,文中如有错误请各路大佬指点,感兴趣的可以阅读其他更加深入的大佬文章~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野生的狒狒

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值