本文主要是介绍初阶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 % 10);//逆序实现,非递归//while (n){// m = n % 10;// n = n / 10;// printf("%d", m);//}}
本次就结束了,还有一个利用递归进行逆序的题,我觉得这道题很不好理解。我将专门写一篇关于这道题目的文章。
递归的思想是很重要的。我们可以想象成电影《盗梦空间》,一层接着一层的梦境,就好比我们的递归不断的往下进行,只有上一层完成后,才可到下一层。多加练习,多思考,一定会掌握的。
这篇关于初阶C-1107的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!