本题要求实现一个递归函数,用户传入非负整型参数n,用户依次输出1到n之间的整数。所谓递归函数就是指自己调用自己的函数。
说明:
(1)递归函数求解问题的基本思想是把一个大规模问题的求解归结为一个相对较小规模问题的求解,
小规模归结为小小规模,以此类推,直至问题规模小至边界(边界问题可直接求解)。递归函数由两
部分组成,一部分为递归边界,另一部分为递归关系式。以求阶乘函数为例,递归边界Factorial(1)=1;
递归公式: Factorial(n)=n*Factorial(n-1),它对应的递归函数如下:
int GetFactorial(int n){
int result;
if(n==1) result = 1; //递归边界,此时问题答案易知,可直接求解
else result =n* GetFactorial(n-1); //递归关系,大问题求解归结为小问题求解
return result;
}
(2)
递归函数设计的核心是寻找递归边界和递归关系。前者相对简单,后者可以采用类似数学归纳法的思想,
假设小规模问题能递归求解(比如问题规模为n-1时f(n-1)能完成求解),在此基础上考虑如何求解规模为n时如何求解。
若数据对象能拆分为多个部分(比如链表可以拆分为首节点和子链表,子链表比原来的链表小,也可完成递归求解),
在严格小的子模块上完成递归求解后,之后合并各个子模块的解,得到完整解。
(3) 发生函数递归调用(自己调用自己)或者普通函数调用时,系统需要保存调用发生前的执行场景信息
(包括调用发生前的各个变量取值信息以及函数执行位置等),以便被调函数执行完毕后可以顺利返回并继续执行后续操作。
每次调用都需要保存一个场景信息,保存这些场景信息需要的辅助空间的大小与函数调用的次数呈正比,
或者说其空间复杂度是O(n),当中n为调用次数。
(4)本例的目的是让学生编写一个递归函数,并在自己的机器上测试递归调用次数达到多少时会发生内存
被爆而出现内存溢出的错误(我办公室机器上设置参数为66000时会溢出)。同样的这个问题,如果不
用递归函数而改用普通的循环语句解决问题,则不会出现内存溢出!
函数接口定义:
void PrintN (long n);
其中n为用户传入的参数。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
void PrintN(long n);
int main()
{
long n;
scanf("%ld",&n);
PrintN(n);
return 0;
}
/* 请在这里填写答案 */
输入样例:
5
输出样例:
12345
#include <stdio.h>
void PrintN(long n);
int main()
{
long n;
scanf("%ld",&n);
PrintN(n);
return 0;
}
/* 请在这里填写答案 */
void PrintN(long n){
if(n==1){
printf("1");//如果是1,只能输出1
}else{
PrintN(n-1);//不是1的话,再次递归调用这个函数一次打印n-1一直到1
printf("%d",n);
}
}