欢迎访问我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/basic-recursion-and-tail-recursion.html
标题:基本递归与尾递归
作者:MilkCu
摘要:本文主要讲解了递归的两种基本形式,基本递归与尾递归,尾递归在一定程度上可以提高程序效率。然后简要介绍了可执行程序的组成:代码段,静态数据区,堆,栈。从组成上阐述了基本递归的缺陷和尾递归的高效。
基本递归
递归过程的两个基本阶段:递推与回归。
以基本递归方式计算阶乘的函数实现:
#include <stdio.h> int fact(int n) { if(n < 0) { return 0; } else if(n == 0) { return 1; } else if(n == 1) { return 1; } else { return n * fact(n - 1); } } int main(void) { printf("%d ", fact(4)); return 0; }
可执行程序组成
基本上来说一个可执行程序由4个区域组成:代码段、静态数据区、堆与栈。
-
代码段包含程序运行时所执行的机器指令;
-
静态数据区包含在程序生命周期内一直持久的数据,比如全局变量和静态局部变量;
-
堆包含程序运行时动态分配的存储空间,比如用malloc分配的内存;
-
栈包含函数调用的信息。
栈维护了每个函数调用的信息指导函数返回后才释放,函数调用的开销很大。可以采用尾递归避免这些缺点。
尾递归
当递归调用是整个函数中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。
尾递归函数的特点是在回归函数中不用做任何操作,大多数现代的编译器会利用这一特点自动生成优化的代码。
以尾递归的形式计算阶乘的一个函数实现:
#include <stdio.h> int facttail(int n, int a) { if(n < 0) { return 0; } else if(n == 0) { return 1; } else if(n == 1) { return a; } else { return facttail(n - 1, n * a); } } int main(void) { printf("%d ", facttail(4, 1)); return 0; }
(全文完)
本文地址:http://www.milkcu.com/blog/archives/basic-recursion-and-tail-recursion.html