初阶C-1107

这次的初阶都是跟C语言中的递归有关的。可以说递归是一个不好理解的,比较抽象的东西。

递归(Recursion),指在函数的定义中使用函数自身的方法,即程序的自身调用。

递归就是方法里调用自身。

但是递归的缺陷也是非常大的。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

1.递归和非递归分别实现求第n个斐波那契数。

//利用了递归
int Fibonacci(int n){
	if (n == 1 || n == 2){
		return 1;
	}
	return Fibonacci(n - 1) + Fibonacci(n - 2);
}
//不使用递归
void Fib(int n){
	int j = 1, k = 1, sum = 0;
	if (n == 1 || n == 2){
		return 1;
	}
	if (n % 2 == 0){
		for (int i = 1; i < n / 2; i++){
			j += k;
			k += j;
		}
		printf("%d", k);
	}
	else if(n % 2 == 1){
		for (int i = 1; i <= n / 2; i++){
			j += k;
			k += j;
		}
		printf("%d", j);
	}
}

2.编写一个函数实现n^k,使用递归实现.

//n^k  如果调用递归,我们先拆分这个算式
//			n^k=1,k=0;n^k=n*n^(k-1),k>0
double index(double n,double k){
	if (k == 0){
		return 1;
	}
	return n*index(n, k - 1);
}

3.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19.

int DigitSum(int n){
	int m = 0;
	int sum = 0;
	if (n != 0){
		m = n % 10;
		n = n / 10;
		sum = m + DigitSum(n);
	}
	return sum;
}

4.递归和非递归分别实现strlen.

int Strlen(const char*str){
	if ('\0' == *str){
		return 0;
	}
	return 1+Strlen(str + 1);//这里的+1可以理解成每次进行拆分去算
    					   //比如“abcd” 先为“a”+“bcd”,第二次在为“b”+“cd”,以此类推
}

int Strlen2(char str[]){
	int size = 0;
	while (str[size] != '\0'){
		size++;
	}
	return size;
}

5.递归和非递归分别实现求n的阶乘 .

void Fac(int n){
	int j = 1;
	if (n == 1){
		return 1;
	}
	for (int i = 1; i <= n; i++){
		j *= i;
	}
	printf("%d", j);
}

int Fac1(int a){
	if (a == 1){
		return 1;
	}
	return a*Fac1(a-1);
}

6.递归方式实现打印一个整数的每一位.

int PrintfNum(int n){
	if (n < 9){
		printf("%d",PrintfNum(n) / 10);
	}
	printf("%d", n);
    
    //逆序实现,非递归
	//while (n){
	//	m = n % 10;
	//	n = n / 10;
	//	printf("%d", m);
	//}
	
}

本次就结束了,还有一个利用递归进行逆序的题,我觉得这道题很不好理解。我将专门写一篇关于这道题目的文章。

递归的思想是很重要的。我们可以想象成电影《盗梦空间》,一层接着一层的梦境,就好比我们的递归不断的往下进行,只有上一层完成后,才可到下一层。多加练习,多思考,一定会掌握的。

猜你喜欢

转载自blog.csdn.net/skrskr66/article/details/84709739