网站建设资讯

NEWS

网站建设资讯

C语言-函数递归(初识)-创新互联

MENU
      • 1. 递归
      • 2.递归的必要条件
      • 3.1 练习:打印一个整型值(无符号)的每一位
      • 3.2 练习:编写函数不允许创建临时变量以求字符串的长度
      • 3.3 练习:求n的阶乘。
      • 3.4 练习:求第n个斐波那契数。

在陆川等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、成都网站建设 网站设计制作定制设计,公司网站建设,企业网站建设,高端网站设计,网络营销推广,成都外贸网站制作,陆川网站建设费用合理。1. 递归

程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小

2.递归的必要条件

存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。

3.1 练习:打印一个整型值(无符号)的每一位
//接受一个整型(无符号),打印每一位
void prin_num(int num) {
	if (num >9) {
		prin_num(num / 10);
		
	}
	printf("%d", num % 10);
}

int main() {
	int num = 0;
	scanf("%d", &num);
	prin_num(num);
	return 0;
}
3.2 练习:编写函数不允许创建临时变量以求字符串的长度
//编写函数不允许创建临时变量,求字符串的长度。
int find_strlength(char * arr) {
	if (*arr != '\0') {
		return 1 + find_strlength(1 + arr);
	}
	else{
		return 0;
	}
}

int main() {
	char arr[] = "apple";
	
	int len = find_strlength(arr);
	printf("%d", len);
	return 0;
}
3.3 练习:求n的阶乘。

递归写法

//求n的阶乘。(不考虑溢出)
int get_fac(int num) {
	if (num >1) {
		return num * get_fac(num - 1);
	}
	else {
		return 1;
	}
}

int main() {
	int num = 3;

	int fac = get_fac(num);
	printf("%d", fac);

	return 0;
}

使用factorial 函数求10000的阶乘(不考虑结果的正确性),程序会崩溃。
迭代写法

//求n的阶乘,迭代
int get_fac(int n) {
	int rec = 1;
	for (int i = 2; i<= n; i++) {
		rec *= i;
	}
	return rec;
}

int main() {
		int num = 4;

	int fac = get_fac(num);
	printf("%d", fac);

	return 0;
}
3.4 练习:求第n个斐波那契数。
//求第n个斐波那契数。(不考虑溢出)
int get_fib(int n) {
	if (n >2) {
		return get_fib(n - 2) + get_fib(n - 1);
	}
	else {
		return 1;
	}
}
int main() {
	int n = 6;
	int fib = get_fib(n);
	printf("%d", fib);
	return 0;
}

但是我们发现有问题;
在使用fib 这个函数的时候如果我们要计算第50个斐波那契数字的时候特别耗费时间。

//求斐波那契数列(非递归)
int get_fib(int n) {
	int a = 1;
	int b = 1;
	int c = 0;

	//for (int i = 1; i<= (n - 2); i++) {
	//	c = a + b;
	//	a = b;
	//	b = c;
	//}

	//while (n >= 3) {
	//	c = a + b;
	//	a = b;
	//	b = c;
	//	n--;
	//}
	return c;
}
int main() {
		int n = 5;
	int fib = get_fib(n);
	printf("%d", fib);
	return 0;
}

tips

  1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
  2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
  3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所来的运行时开销。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:C语言-函数递归(初识)-创新互联
标题URL:http://njwzjz.com/article/dhoiih.html