递归 ( recursion)
C 语 言 的 函 数 可 进 行 递 回 呼 叫 ( recursive call ) , 也 就 是 说 在函 数 之 中 可 呼 叫 函 数 本 身 。 函 数 在 进 行 递归 呼 叫 时 , 在 其 所 使 用 的 变 数 被 堆 积 在 堆 叠 区 域 , 每次 执 行 return 叙 述 , 函 数 在 该 层 呼 叫 中 所 使 用 的 变 数 就 从 堆 叠 返 回 。
l l 递归函数之特性
1. (1) 每 次 执 行 return 叙 述,问题范围缩小
2. (2) 具有一个终止递归之条件
程序实例: 递归 int factorial(int j) {
|
result : |
l l 递归函数之内部处理
1. 1. 一般函数之呼叫
2. 2. 递归函数之呼叫
01 | * =================================================== */ |
02 | /* 程序实例:使用打印数组函数说明递归函数之呼叫 */ |
03 | /* ================================================== */ |
04 |
|
05 | int list[6] = { 1, 2, 3, 4, 5, 6 }; /* 数组内容 */ |
06 |
|
07 | /* ----------------------------------------------------------------------------------- */ |
08 | /* 递归数组反向打印函数 */ |
09 | /* ----------------------------------------------------------------------------------- */ |
10 | void invert_array(int j) |
11 | { |
12 | if ( j < 6 ) /* 终止条件 */ |
13 | { /* 递归串行打印函数呼叫 */ |
14 | invert_array(j + 1); |
15 | printf("[%d]",list[j]); /* 打印元素数据 */ |
16 | } |
17 | } |
18 | /* ----------------------------------------------------------------------------------- */ |
19 | /* 主程序: 反向打印数组内容. */ |
20 | /* ----------------------------------------------------------------------------------- */ |
21 | void main() |
22 | { |
23 | int i; |
24 |
|
25 | printf("数组的内容:/n"); |
26 | for ( i= 0; i < 6 ; i++) |
27 | printf("[%d]",list[i]); /* 打印元素数据 */ |
28 | printf("/n"); /* 换行 */ |
29 | printf("递归打印数组的内容:/n"); |
30 | invert_array(0); /* 呼叫打印函数 */ |
31 | printf("/n"); /* 换行 */ |
32 | } |
程序实例: 费博尼西数列 long fib(int n) { if (n <=2) return (1); return (fib( n-2) + fib(n-1)); } |
Fib函数执行计算过程