这次的初阶都是跟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);
//}
}
本次就结束了,还有一个利用递归进行逆序的题,我觉得这道题很不好理解。我将专门写一篇关于这道题目的文章。
递归的思想是很重要的。我们可以想象成电影《盗梦空间》,一层接着一层的梦境,就好比我们的递归不断的往下进行,只有上一层完成后,才可到下一层。多加练习,多思考,一定会掌握的。