1. 程式人生 > >初階C-1107

初階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);
	//}
	
}

本次就結束了,還有一個利用遞迴進行逆序的題,我覺得這道題很不好理解。我將專門寫一篇關於這道題目的文章。

遞迴的思想是很重要的。我們可以想象成電影《盜夢空間》,一層接著一層的夢境,就好比我們的遞迴不斷的往下進行,只有上一層完成後,才可到下一層。多加練習,多思考,一定會掌握的。