用实战带你“玩转”函数递归

函数递归知识总结

1.函数递归:直接或者间接调用自己的方式
注:
(1)函数递归的思想就是将大的问题转化为一步一步小的问题,从而实现算法和代码的简化,方便自己理解过程、实现代码。这不仅仅是一个函数相关的知识点,更是一个重要的结局问题的思维方式,无论是分治法还是递归法都是“简化”方法,都是我们思考问题的重要维度
(2)在进行函数递归的时候必须有一个限制条件/界限,并且在递归的深度不断增大的时候,条件应该逐渐逼近限制条件。这是函数递归过程中尤为重要的一点,因为递归我们可以理解成为一种特殊的“循环”,我们为了解决一定的问题,是不会希望“循环”一直进行下去,在完成任务以后我们会希望递归停止,所以我们要有一定的条件,能够使函数递归有一定的限度,否则就会出现STACK OVERFLOW(栈溢出) 或者是死循环的程序。
2.实战问题
(1)strlen函数的模拟实现:
方法一:计数器法

int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}

下面我们来分析一下这段代码:
我们都知道,字符串的结束标=标志是 ’ \0 ’ ,所以我们不断寻找 ’ \0 ’ 只要不是 ’ \0 ’ 说明,这个字符串还没有结束,所以我们继续使计数器 ” count “ +1。 当找到 ’ \0 ’ 即得到结果。
这种使不适用函数递归的,下面我们着重介绍一下函数递归的实现

方法二:函数递归,不使用技术器

int my_strlen(char* str)
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

我们把一个字符串”分而治之
在这里插入图片描述
以字符串”abcd“为例,我们把abcd一个一个分离出来,先挑出 ‘ a ’ 然后剩下了字符串 ” bcd “ 再将字符串 ” bcd “ 分离成 ’ b ‘ + ” cd “ 以此类推直到遇到 ’ \0’ ,我们就得到了每一个字符,然后我们再将每次嗲用函数的返回值+1即可得到最后的字符个数

(2)阶乘的实现:

int Fac(int n)
{
	if (n >= 1)
		return n*Fac(n - 1);
	else
		return 1;
}

下面我们来分析一下这段代码:
我们以3的阶乘为例:

在这里插入图片描述
也就是说我们可以将n! 转换为n*(n-1)! (n=1)!转换为 (n-1)*(n-2)! 。。。。。以此类推

(3)斐波那契数列:

int Fib(n)
{
	return n > 2 ? Fib(n - 1) + Fib(n - 2) : 1;
}

下面我们来分析一下这段代码:
斐波那契额数列的算法是什么呢? 就是第n项为前两项的和。例如:第五项a3=2 第四项a4=3 那么第五项a5=a3+a4=5。同时规定a1=1 a2=1
根据这一个规律,我们很容易想到用函数递归来实现,所以当n<=2使,函数值返回1,当n>2时,函数值返回第n-1项值和第n-2项值,即可得到第n项的值

虽然这个方法很好理解,但是计算量非常非常大,会有大量的重复运算,所以当n比较大时,运行时间将会大大增加

3.小结
函数递归作为一种重要的思想和手段,对于程序的简化和程序的理解提供了很好的帮助,希望这篇文章能对小白们有所帮助,当然,我还有不少函数递归的例题和我自己实现时候的思路和想法,有需要的朋友们可以给我留言,我会继续更新。
https://blog.csdn.net/cdzg_zzk/article/details/112789499
这是我利用函数递归写的十进制向任何进制转换的博客,有兴趣的朋友可以看一下,若能提出宝贵的意见,我将万分感谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值