栈的递归调用

所谓递归,就是程序调用自身的过程,它可以把一个大型的,复杂的问题层层转化为一个与原问题相似的,规模较小的问题来求解,递归策略只需要少量的代码就可以描述出解题过程中所需要的多次重复计算,大大地减少了程序的代码量。
一般来说,递归需要有临界条件:递归前进和递归返回段。否则,递归将无线调用,永远无法结束程序,最后会造成内存崩溃。
递归作为一种算法在程序设计语言中被广泛应用,例如,在数学运算中经常遇到计算自然数和的情况,假设要计算1到n之间的自然数之和,就需要先计算1加2的结果,用这个结果加3再得到一个结果,用新得到的结果加4,以此类推,直到用1~(n-1)之间所有数的和加n,此题就可以用递归来解决。

#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)

int getSum(int n)
{
   if(n==1)
     return 1;
   int temp=get(n-1);
   return temp+n;
}

int main()
{
   int sum=0;
   int n=0;
   printf("请输入n的值:\n");
   scanf("%d",&n);
   sum=getSum(n);
   printf("结果:%d\n",sum);
   system("pause");
   return 0;
}

整个递归过程中getSum( )函数被调用了4次,每次调用时,n的值都会减1。当n的值为1时,所有递归调用的函数都会以相反的顺序相继结束,所有的返回值会进行累加,最终得到的结果是10。
事实上,计算机在运行过程中都是用栈来存储程序中的变量,函数等,当定义了一个变量,变量入栈,使用完毕后就出栈。在递归运算时,函数也不断地被调用进栈,当运行完毕后再依次出栈。接下来就分析上述程序的递归调用过程。
(1)当传入参数n=4时,调用getSum( )函数,getSum( )函数入栈,运行函数内代码;
(2)步骤(1)中再次调用getSum( )函数,参数值为3,则getSum( )再次入栈;
(3)步骤(2)中再一次调用getSum( )函数,参数值为2,则getSum( )函数再次入栈…以此类推,直到n=1时,getSum( )函数最后一次入栈,此时栈中的情况;
(4)当n=1时,返回值为1,返回给上次函数调用,则此次函数调用失败,函数出栈;
(5)当n=2,调用的函数得到的出栈的函数返回的值时,就计算出了它这一步调用的结果,将结果返回后,本次调用结束,函数出栈。
(6)以此类推,直到第一次函数调用(n=4时)结束,将计算出的结果返回,然后弹栈。
这就是递归在栈中实现的执行和回退过程,回退过程的顺序是执行过程中的逆序,下一次调用都为上一次调用提供需要,显然这很符合栈的特点,编译器就是利用这个特点来实现递归管理的。当然,对于现在的高级语言来说,这样的递归,以及程序中变量的管理是不需要程序员自己来操作的,一切都是由操作系统执行,但读者也需要理解其原理。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值