递归—基本递归

递归

基本递归:

一种强大的方法,允许一个问题以其自身越来越小的形式定义自己。在计算机科学领域,我们通过使用递归函数来解决带有递归性质的问题,也就是用函数调用自身。

基本递归:例如以递归方式求一个数的阶乘

#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个区域组成:输入参数,返回值空间,计算表达式时用到的临时存储空间,函数调用时保存的状态信息以及输出参数。(输入参数是传递到活跃记录中的参数:输出参数是传递给活跃记录中调用的函数所使用的。一个活跃记录中的输出参数就成为栈中下一个活跃记录的输入参数,函数调用产生的活跃记录将一直存在于栈中直到这个函数调用结束)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章