递归
基本递归:
一种强大的方法,允许一个问题以其自身越来越小的形式定义自己。在计算机科学领域,我们通过使用递归函数来解决带有递归性质的问题,也就是用函数调用自身。
基本递归:例如以递归方式求一个数的阶乘
#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() {
int a;
printf("请输入一个值:\n");
scanf("%d", &a);
int sum;
sum = fact(a);
printf("这个值的阶乘结果是%d\n", sum);
system("pause");
}
理解递归究竟是如何工作的,有必要先看看C语言中函数的执行的方式。基于这点,我们需要了解关于C程序在内存中的组织方式。基本上来说一个可执行程序由4个区域组成;代码段,静态数据区,堆与栈。
代码段包含程序运行所执行的机器指令。
静态数据区包含在程序生命周期内一直持久的数据,比如全局变量和静态局部变量。
堆包含程序运行时时态分配的存储空间,比如用malloc分配的内存。
栈包含函数调用的信息。按照惯例,堆的增长方向从程序低地址到高地址向上增长,而栈的增长方向刚好相反(实际情况可能不是这样,与CPU的体系结构有关)。
当C程序中调用了一个函数时,栈中会分配一块空间来保存与这个调用相关的信息。每一个调用都被当做是活跃的。栈上的那块存储空间称为活跃记录,或者称为栈帧。
栈帧由5个区域组成:输入参数,返回值空间,计算表达式时用到的临时存储空间,函数调用时保存的状态信息以及输出参数。(输入参数是传递到活跃记录中的参数:输出参数是传递给活跃记录中调用的函数所使用的。一个活跃记录中的输出参数就成为栈中下一个活跃记录的输入参数,函数调用产生的活跃记录将一直存在于栈中直到这个函数调用结束)