1, 递归
C 通过运行时堆栈支持递归函数的实现.
递归函数就是直接或间接调用自身的函数.
一个小例子:
- /**
- 使用递归将整型转换为 ascii 字符
- @param value 整型数
- */
- void binary2ascii(unsigned int value) {
- unsigned int quotient;
- quotient = value / 10;
- if (quotient != 0) {
- binary2ascii(quotient);
- }
- putchar(value % 10 + '0');
- }
2, 两个递归运用和用迭代优化的例子
尾递归: 递归调用出现在函数的尾部, 并且之后不再执行任何任务
尾递归可以方便的转换为迭代. 由于递归是非常耗费内存的 (每次函数调用都会在内存中分配空间), 内存频繁的分配回收严重影响程序的执行效率.
- /**
- 递归计算阶乘
- @param n 整数 n
- @return 阶乘
- */
- long factorial(unsigned int n){
- if (n <= 0) {
- return 1;
- }else{
- return n * factorial(n - 1);
- }
- }
- /**
- 迭代计算阶乘
- @param n 整数 n
- @return 阶乘
- */
- long factorial_iteria(int n){
- int result = 1;
- while (n> 1) {
- result *= n;
- n -= 1;
- }
- return result;
- }
- /**
- 递归计算斐波那契数
- 效率非常低: 计算 fibonacci(10) 时, fibonacci(3) 重复计算了 21 次, 计算 fibonacci(30) 时, fibonacci(3) 计算了 317811 次
- @param n 整数 n
- @return n 的斐波那契数
- */
- long fibonacci(int n){
- if (n <= 2) {
- return 1;
- }
- return fibonacci(n - 1) + fibonacci(n - 2);
- }
- /**
- 迭代求斐波那契数列
- @param n 整数 n
- @return n 的斐波那契数
- */
- long fibonacci_iteral(int n){
- long result;
- long previous_result;
- long next_older_result;
- result = previous_result = 1;
- while (n> 2) {
- n -= 1;
- next_older_result = previous_result;
- previous_result = result;
- result = previous_result + next_older_result;
- }
- return result;
- }
来源: http://www.bubuko.com/infodetail-2961886.html