初识C语言之递归1

Posted zsQgqdsd1002

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识C语言之递归1相关的知识,希望对你有一定的参考价值。

什么是递归?通俗的来讲,就是程序调用自己来完成问题的一种编程技巧。递归的主要思考方式就是大事化小,把一个复杂的问题简单化,找到其中的规律,缩小原问题的规模。

递归有两个必要条件,首先呢一定要有一个限制条件,当满足这个限制条件的时候递归就停止了,不再继续,因为如果没有限制条件,程序就会一直调用自身,不断的开辟新的空间和内存,最后会导致堆栈溢出或者程序崩溃。其次就是每一次递归调用之后要越来越接近这个限制条件,原因也和前面说的一样,如果离限制条件越来越远了那就等于没有限制条件。最后,如果想要递归,满足上面两个条件之后,一定要找到一个递归表达式,让程序根据这个递归表达式来不断地调用自身,最终达到我们预期的结果。

了解到了这些,就可以来做一道简单的递归题目,也就是我之前提到过的打印n的阶乘,之前是采用了循环的方式来打印,这次试着用递归的方式来做一下。

首先就是找规律,n!有什么规律呢,很显然的我们可以发现,当n大于1的时候,n!= n * (n-1)!,(虽然当n = 1时,1!=1*0!,但是这只是数值相等,意义上是有很大区别的)所以我们的限制条件也就找到了,也就是说在n=1的时候,程序的递归调用就可以停止了。同时我们也找到了递归表达式就是n*n-1,既然都找到了我们就可以开始编写程序了。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int JieC(int n) {
	if (n == 1) {
		return 1;
	}
	else {
		int ret = n * JieC(n - 1);
		return ret;
	}
}
int main() {
	int n;
	scanf("%d", &n);
	int ret = JieC(n);
	printf("%d", ret);
	return 0;
}

当然这是不考虑堆栈溢出的情况,如果元素实在太多的话很有可能导致堆栈溢出,程序呢也是非常的通俗易懂,这里就不赘述了。下面我们再来看一道入门的关于递归的实现的题目。

这道题目是说,求一个字符串的长度,用递归来实现,不能使用strlen函数。

想到字符串长度肯定首先会想到strlen,但是这道题目不让使用strlen,那我们就得另辟蹊径,从递归的角度来看看这个问题。首先我们想一想,求一个字符串的长度有什么规律,好像就是123456数过去,并没有什么规律。其实,这就是规律,字符串的长度=1+剩余字符的长度,也就是我们说的123456数过去。那么规律现在是找到了,限制条件呢?其实这个时候我们只要找到字符串的结尾,来结束递归就可以了,字符串的结尾是什么呢?没错,就是’\\0’。至于用什么来找’\\0’,指针会是一个很不错的选择,我们可以定义一个char类型的指针,用它来遍历字符串,没有遇到’\\0’就加一,往后继续遍历,遇到’\\0’则结束递归。那么思路现在已经很明确了,我们开始编写程序。

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

int main() {
	char* a = "Hello,CSDN";
	int ret = _myStrlen(a);
	printf("%d", ret);
	return 0;
}

这个程序也是非常的通俗易懂,就不多做赘述了,以上就是我对递归入门级别的看法和理解,如果有可以优化或者e需要改正的地方,大佬可以评论在下面,我会一一改正的。

以上是关于初识C语言之递归1的主要内容,如果未能解决你的问题,请参考以下文章

初识函数递归

C语言初学者之初识代码专项练习

初识C语言之十个整数找最大

C语言之递归---数组的逆顺输出

C语言之递归---数组的逆顺输出

初识C语言之指针入门1