C_深入理解递归

递归
一、概念:程序调用自身。
二、思想:将大化小。
三、使用必要条件:
     1、处理问题的子问题可以被相同的逻辑处理;
     2、存在递归出口;
     3、每次调用自身之后越来越接近此递归出口。
四、优缺点:
     优:便于理解、代码小;
     缺:开销大、性能低(程序调用自身,自身也为函数,调用函数则要建立栈帧,释放栈帧)
总:基于此,在问题过于复杂时,递归的简洁性可以补偿它的开销;至于遇到问题使用什么算法,还是看情况而定。

五、几个递归练习以及与非递归的比较
1.递归和非递归分别实现求第n个斐波那契数;
2.编写一个函数实现n^k,使用递归实现;
3.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和;
4. 编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列、要求:不能使用C函数库中的字符串操作函数;
5.递归和非递归分别实现strlen;
6.递归和非递归分别实现求n的阶乘;
7.递归方式实现打印一个整数的每一位。

#include<stdio.h>
#include<Windows.h>


//斐波那契数列(递归)
int fib_r(int n)
{
	if (n == 1 || n == 2){
		return 1;
	}
	return fib_r(n - 1) + fib_r(n - 2);
}

//斐波那契数列(迭代)
int fib_i(int n)
{
	int first = 1;
	int second = 1;
	int sum = 1;
	int i = 1;
	while (i <= n - 2){
		sum = first + second;
		first = second;
		second = sum;
		i++;
	}
	return sum;
}

//n^k(递归)
int power_r(int n, int k)
{
	if (k == 1){
		return n;
	}
	return n*power_r(n, k - 1);
}

//n^k(迭代)
int power_n(int n, int k)
{
	int res = 1;
	while (k){
		res *= n;
		k--;
	}
	return res;
}

//求整型各个位数之和(递归)
//n:1826		sum += 6
//n:182		sum += 2
//n:18			sum += 8
//n:1			sum += 1
//先下后上
int digitSum(int n)
{
	/*int sum = 0;
	if (n){
		sum += n % 10 + digitSum(n / 10);
	}
	return sum;*/
	//不创建临时变量
	if (n < 10){
		return n;
	}
	return digitSum(n / 10) + n % 10;
}

//字符串反转(递归)
//str = ello	*(str-1) = h
//str = llo		*(str-1) = e
//str = lo		*(str-1) = l
//str = o		*(str-1) = l
//str = '\0'	*(str-1) = o
//先下后上
void reverse_string(const char * str)
{
	if (*(++str)){
		reverse_string(str);
	}
	printf("%c", *(str - 1));//跳过'\0'
}

//字符串反转存入数组中
void reverse_string2(const char *str, char *buf, int *i)
{
	if (*(++str)){
		reverse_string2(str, buf, i);
	}
	buf[(*i)++] = *(str - 1);
}

//求字符串长度(递归)
int myStrlen_r(const char * str)
{
	if (!*str){
		return 0;//不包括'\0'
	}
	return 1 + myStrlen_r(str + 1);
}

//求字符串长度(迭代)
int myStrlen_n(const char * str)
{
	int i = 0;
	while (*str){
		str += 1;
		i++;
	}
	return i;
}

//n的阶乘(递归)
int factorial_r(int n)
{
	if (n == 1){
		return 1;
	}
	return n*factorial_r(n - 1);
}

//n的阶乘(迭代)
int factorial_n(int n)
{
	int res = 1;
	while (n){
		res *= n;
		n--;
	}
	return res;
}

//打印整数的每一位(递归)
void printIntBit(int n)
{
	if (n > 9){
		printIntBit(n / 10);
	}
	//执行到这里说明:if条件不满足或递归开始返回
	printf("%d ", n % 10);
}

int main()
{
	/*printf("%d\n", fib_r(10));
	printf("%d\n", fib_i(10));*/

	/*printf("%d\n", power_r(8, 5));
	printf("%d\n", power_n(8, 5));*/

	//printf("%d\n", digitSum(1826));

	//reverse_string("hello");
	char buf[64];
	int i = 0;
	reverse_string2("hello", buf, &i);
	buf[i] = '\0';

	/*printf("%d\n", myStrlen_r("hello!"));
	printf("%d\n", myStrlen_n("hello!"));*/

	/*printf("%d\n", factorial_r(3));
	printf("%d\n", factorial_n(3));*/

	//printIntBit(167);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/tec_1535/article/details/80245544