数据结构6-1 爆内存函数实例 (6 分)

这篇博客探讨了递归函数的概念,通过一个实例展示了当递归调用次数过多时可能导致内存溢出的问题。作者指出,递归函数在解决大规模问题时将问题分解为小规模,递归边界和递归关系式是其核心组成部分。文中以计算阶乘为例,解释了递归调用过程中系统保存执行场景信息所需的空间与调用次数成正比,导致空间复杂度为O(n)。并通过实验发现当递归深度达到66000时,可能会引发内存溢出。对比之下,使用循环语句则能避免此类问题。
摘要由CSDN通过智能技术生成

本题要求实现一个递归函数,用户传入非负整型参数n,用户依次输出1到n之间的整数。所谓递归函数就是指自己调用自己的函数。

说明:
(1)递归函数求解问题的基本思想是把一个大规模问题的求解归结为一个相对较小规模问题的求解,
小规模归结为小小规模,以此类推,直至问题规模小至边界(边界问题可直接求解)。递归函数由两
部分组成,一部分为递归边界,另一部分为递归关系式。以求阶乘函数为例,递归边界Factorial(1)=1;
递归公式: Factorial(n)=nFactorial(n-1),它对应的递归函数如下:
int GetFactorial(int n){
int result;
if(n==1) result = 1; //递归边界,此时问题答案易知,可直接求解
else result =n
GetFactorial(n-1); //递归关系,大问题求解归结为小问题求解
return result;
}
(2) 发生函数递归调用(自己调用自己)或者普通函数调用时,系统需要保存调用发生前的执行场景信
息(包括调用发生前的各个变量取值信息以及函数执行位置等),以便被调函数执行完毕后可以顺利返
回并继续执行后续操作。每次调用都需要保存一个场景信息,保存这些场景信息需要的辅助空间的大小
与函数调用的次数呈正比,或者说其空间复杂度是O(n),当中n为调用次数。
(3)本例的目的是让学生编写一个递归函数,并在自己的机器上测试递归调用次数达到多少时会发生内存
被爆而出现内存溢出的错误(我办公室机器上设置参数为66000时会溢出)。同样的这个问题,如果不
用递归函数而改用普通的循环语句解决问题,则不会出现内存溢出!
函数接口定义:

void PrintN (long n);

其中n为用户传入的参数。
裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:

#include <stdio.h>
void PrintN(long n);

int main()
{
    PrintN(66000L);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

5

输出样例:

12345

void PrintN(long n)
{
    if(n==1)
        printf("%d",n);
    else{

        PrintN(n-1); 
        printf("%d",n);
    }

}
//根据提示用递归作答,而且是从小到大输出。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值