初階C-1107
阿新 • • 發佈:2018-12-02
這次的初階都是跟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);
//}
}
本次就結束了,還有一個利用遞迴進行逆序的題,我覺得這道題很不好理解。我將專門寫一篇關於這道題目的文章。
遞迴的思想是很重要的。我們可以想象成電影《盜夢空間》,一層接著一層的夢境,就好比我們的遞迴不斷的往下進行,只有上一層完成後,才可到下一層。多加練習,多思考,一定會掌握的。