【C语言】递归练习题小结

来源:互联网 发布:4k电视盒子 知乎 编辑:程序博客网 时间:2024/05/21 22:57

     程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

    在学习C语言的时候,递归也作为一个重要的角色出现在我们的视野中。

     在递归的案例中,斐波那契数是一个很经典的例题,在前面已经为大家总结(C语言实现斐波那契数列点击打开链接)。在此也为大家附上其它的练习:


1、编写一个函数求n的阶乘:

//递归#include<stdio.h>#include<string.h>#include<assert.h>int fa(int n){if (n <= 1){return 1;}else{return n*fa(n - 1);}}int main(){int n = 5;int ret = fa(n);printf("ret = %d\n", ret);system("pause");return 0;}



2、编写一个函数,可以分别打印一个整数十进制的每一位:

#include<stdio.h>#include<string.h>//#include<assert.h>void print(int n){if (n > 9){print(n / 10);}printf("%d\n", n % 10);}int main(){print(1234);system("pause");return 0;}



3、编写一个函数实现n^k,使用递归实现:

#include<stdio.h>int pow(int n, int k){if (k == 0){return 1;}else if (k == 1){return n;}else{return n*pow(n, k-1 );}}int main(){int n = 2;int k = 3;printf("%d\n", pow(n, k));system("pause");return 0;}



4、不允许创建临时变量求字符串长度,实现strlen的模拟:

#include<stdio.h>#include<assert.h>int my_strlen_no(char const *p){assert(p != NULL);if (*p == NULL){return 0;}else{return (1 + my_strlen_no(p + 1));}}int main(){char *p = "abcdef";printf("长度是:%d\n", my_strlen_no(p));system("pause");return 0;}



5、编写一个函数reverse_string(char * string)(递归实现):

#include<stdio.h>void reserve_string(char *string){if (*string == '\0')printf("%c", *string);else{reserve_string(++string);//输入下一个字符printf("%c", *(--string));}}int main(){char s[] = "abcdef";reserve_string(s);system("pause");return 0;}



6、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和:

#include<stdio.h>int dig(int n){if (n <= 10){return 1;}else{return (n % 10 + dig(n / 10));}}int main(){printf("%d\n", dig(1729));system("pause");return 0;}


      递归的能力在于用有限的语句来定义对象的无限集合。递归的熟练使用能让很大的工程变得简单,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。所以它在C语言中有很大的比重,上面的习题也很经典,如果有错误欢迎大家批评指正!吐舌头





原创粉丝点击