- 递归是什么
函数调用自己本身这种调用过程称为递归
- 递归原理
函数调用本质就是入栈出栈的过程,先入后出;可以假设有一个函数调用链,不过实际使用fun2,fun3,fun4都是fun1
- 递归实例
可以使用循环的地方通常可以使用递归,递归方法简单,但效率没有递归高,因为每次递归都会创建一些变量放入栈中,递归调用的数量受限于内存空间。
#include<stdio.h> void up_and_down(int n); int main(void) { up_and_down(1); return 0; } void up_and_down(int n) { printf("level %d: n location %p\n",n, &n); if (n < 4) up_and_down(n+1); printf("LEVEL %d: n location %p\n", n, &n); }
运行结果:
level 1: n location 000000000062FE30
level 2: n location 000000000062FE00
level 3: n location 000000000062FDD0
level 4: n location 000000000062FDA0
LEVEL 4: n location 000000000062FDA0
LEVEL 3: n location 000000000062FDD0
LEVEL 2: n location 000000000062FE00
LEVEL 1: n location 000000000062FE30
递归在处理倒序方便,如下实例,输入十进制用二进制表示的算法
#include<stdio.h> void print_ocl_to_hex(int m); void to_binary(int m); #define MAX_SIZE 100 int a[MAX_SIZE]; int main(void) { int number; printf("please input a octal number :"); scanf("%d",&number); // to_binary(number); print_ocl_to_hex(number); return 0; } void print_ocl_to_hex(int m) { int i,j; if (m ==0) { printf("%d\n", m); } else { for (i = 0; m > 0; i++) { a[i] = m % 2; m = m / 2; } for (j = (i-1); j >= 0; j--) { printf("%d", a[j]); } } } void to_binary(int m) { int n; n = m % 2; m = m / 2; if (m != 0) to_binary(m); printf("%d", n); /* int r; r = m % 2; if (m >=2) { to_binary(m/2); } putchar(r == 0 ?'0':'1'); */ }
- 递归分类
尾递归:把递归调用置于函数末尾,return语句之前。相当于循环
双递归:函数每一条递归都要调用本身两次
冲冲冲