函数递归

来源:互联网 发布:好孩子淘宝店是正品吗 编辑:程序博客网 时间:2024/06/10 02:06

什么是递归?

程序调用自身的编程技巧称为递归( recursion)。

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的主要思考方式在于:把大事化小

递归的两个必要条件

存在限制条件,当满足这个限制条件的时候,递归便不再继续。

每次递归调用之后越来越接近这个限制条件。


求第n个斐波那契数。(不考虑溢出):

递归:

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>int fib(int n){if (n <= 2){return 1;}else{return fib(n - 1) + fib(n - 2);}}int main(){int n = 0;printf("请输入第n个斐波那契数:\n");scanf("%d", &n);int ret = fib(n);printf("%d\n", ret);system("pause");return 0;}
非递归:

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>int fib(int n){int A1 = 1;int A2 = 1;int A3 = 0;if (n <= 2){return 1;}else{while (n > 2){A3 = A1+ A2;A1 = A2;A2 = A3;n--;}}return A3;}int main(){int n = 0;printf("请输入第n个斐波那契数:\n");scanf("%d", &n);int ret = fib(n);printf("%d\n", ret);system("pause");return 0;}


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

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>int nk(int n, int k){if (k == 0){return 1;}else if (k == 1){return n;}else{return n*nk(n, k - 1);}}int main(){int n = 1;int k = 1;printf("请输入n的k次方(n k):\n");scanf("%d %d", &n, &k);int ret = nk(n,k);printf("%d\n", ret);system("pause");return 0;}


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

例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 

int digitSum(int n){if (n > 9){return digitSum(n % 10) + digitSum(n / 10);}else{return n;}}int main(){unsigned int n = 0;printf("请输入一个数:\n");scanf("%d", &n);int ret = digitSum(n);printf("%d\n", ret);system("pause");return 0;}


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

实现:将参数字符串中的字符反向排列。 

要求:不能使用C函数库中的字符串操作函数。 

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>#include <assert.h>void reverse_string(const char *string){assert(string);if (*string != '\0'){string++;reverse_string(string);printf("%c ", *(string - 1));}}int main(){char *string = "ABCDEFGHIJKLMNOPQRSTYVWSYZ";reverse_string(string);system("pause");return 0;}


递归和非递归分别实现strlen 

递归:

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>int mystrlen(const char *str){if (*str == '\0'){return 0;}else{return 1 + mystrlen(str + 1);}}int main(){char *p = "abcdefg";int len = mystrlen(p);printf("%d\n", len);system("pause");return 0;}

非递归:

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>//方法一int mystrlen1(const char *str){int count = 0;while (*str){count++;str++;}return count;}//方法二int mystrlen2(const char *str){char *pp = str;while (*pp != '\0'){pp++;}return (int)(pp - str);}int main(){char *p = "abcdefg";int len1 = mystrlen1(p);int len2 = mystrlen2(p);printf("%d\n", len1);printf("%d\n", len2);system("pause");return 0;}

递归和非递归分别实现求n的阶乘 

递归:

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>int factorial(int n){if (n <= 1){return 1;}else{return n*factorial(n - 1);}}int main(){int n = 0;printf("请输入一个数:\n");scanf("%d", &n);int ret = factorial(n);printf("%d\n", ret);system("pause");return 0;}
非递归:

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>int factorial(int n){int result = 1;while (n > 1){result *= n;n -= 1;}return result;}int main(){int n = 0;printf("请输入一个数:\n");scanf("%d", &n);int ret = factorial(n);printf("%d\n", ret);system("pause");return 0;}

递归方式实现打印一个整数的每一位 

#define _CRT_SECURE_NO_WARNINGS 0#include <stdio.h>#include <windows.h>void print(int num){if (num > 9){print(num / 10);}printf("%d ", num % 10);}int main(){int num = 0;printf("请输入一个数:\n");scanf("%d", &num);print(num);system("pause");return 0;}

提示:

1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。

3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。



原创粉丝点击