在学习递归时遇到的问题

在上一篇博客里我们写了学习递归的时候应该怎么去思考,然后我在学习的过程中遇到了一些问题,这种问题往往是致命性的,是整个递归环节中最重要的的点,我在完成作业的过程中有好几道题都是因为这个点所以递归没法执行。
上一篇博客的链接:https://blog.csdn.net/weixin_44372771/article/details/86411774

例子1

利用递归实现strlen()函数的功能
  • 看到这个题目的时候我们首先想到的就是拆分,把大事化小,这样我们可以每次拆一个字符出来,每次拆分一个字符串出来就可以给我们想要得到的长度+1,最终就可以得到我们想要的:字符串长度。我当时的思路就是这样,写出的代码如下:
int my_strlen(char *arr)
{
	while (*arr != '\0')
	{
		return 1 + my_strlen(arr + 1);
	}
}

这段代码乍一看好像是我们的思路,但是我没有考虑到最重要的环节,当函数递归进入到最深层的时候(也就是字符串被拆分完了以后只剩下一个’\0’的时候),我们的函数是没有做任何的处理的,那么这个函数的值为多少,我们是不知道的,我试着放进一个空字符串的时候,函数的返回值为11926247,像是一个随机值!也就是说我们必须考虑到函数最深层的时候函数仍然是可行有效的。所以这里稍微修改一下代码,如下:

int my_strlen(char *arr)
{
	while (*arr != '\0')
	{
		return 1 + my_strlen(arr + 1);
	}
	return 0;
}
  • 这样我们试着调用一下这个函数,就发现我们可以成功的计算出我们想要的结果了。

例子2

写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和。
  • 这个题我们拿到手,很明显的发现这是一道可以用递归解决的问题,因为它也是一道需要我们拆分每一位数字的题目,我们每调用一次函数就拿出来一位数,然后继续使用函数不停的去拆分这个数,将每一次的数字相加就好了。可以写出如下函数:
int DigitSum(int x)
{
	if (x > 9)
		return (x % 10) + DigitSum(x / 10);
}

经过上一题的讨论,这一题应该很容易就可以看出来我的错误在哪里,很明显,当函数调用到最后一次的时候(也就是x<=9的时候),我们的函数就没法在给定一个返回值,那么这个值就有可能是类似于上一题中的随机值,所以当我们给定x<=9时函数的返回值时,函数就可以正常的运行了,如下:

int DigitSum(int x)
{
	if (x > 9)
		return (x % 10) + DigitSum(x / 10);
	else
		return x;
}
  • 从这两个例子可以看出当我们在使用递归思想解决问题的时候,一定要注意,递归到达最后一次的时候函数的值必须为已知的值,不然当函数运行到最后一次的时候返回的值是不确定的,这样就会导致整个递归函数最终的返回结果差的十万八千里。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值