一、递归定义:一个函数自己直接或者间接调用自己
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
二、满足条件
1)必须有一个明确的终止条件(预定值)
2)所处理的数据规模必须逐渐减小
三、举例
1.1+2+3+...+100的和
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<stdio.h> int sum(int n); int main(void) { int n; printf("请输入您要实现n项的和,n= "); scanf("%d",&n); printf("n! == %d\n",sum(n)); return 0; } int sum(int n) { if(1 == n) { return 1; }else{ return n+sum(n-1); } }
2.求阶乘
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<stdio.h> //递归实现N的阶乘 int factorial(int n); int main(void) { int n; printf("请输入您要实现的阶乘,n= "); scanf("%d",&n); printf("n! == %d\n",factorial(n)); return 0; } int factorial(int n) { if(1 == n) { return 1; }else{ return n*factorial(n-1); } }
3.汉诺塔
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<stdio.h> //汉诺塔的实现 void Move(char a, char b); void Hanoi(int n, char a, char b, char c); int main(void) { int n; char a,b,c; printf("请输入盘片数量,n= "); scanf("%d",&n); Hanoi(n,'a','b','c'); return 0; } void Hanoi(int n,char a,char b,char c) { if(n == 1) { Move(a,c); } else { Hanoi(n-1,a,c,b); //将a柱子n-1个圆盘移动到b柱子 Move(a,c); Hanoi(n-1,b,a,c); //再把b上暂时放着的n-1个圆盘移动到c } } void Move(char a, char b) { printf("Move 1 disk: %c ---------> %c\n",a,b); }
四、递归与循环
递归:易于理解;速度慢;占用空间大;
循环:不易理解;速度快;占用空间小;