C语言-函数递归(初识)

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. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所来的运行时开销。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值