1. 程式人生 > >6-1 爆內存函數實例 (6 分)

6-1 爆內存函數實例 (6 分)

result 輔助 空間復雜度 部分 分組 執行 裁判 調用次數 其中

本題要求實現一個遞歸函數,用戶傳入非負整型參數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) 發生函數遞歸調用(自己調用自己)或者普通函數調用時,系統需要保存調用發生前的執行場景信
息(包括調用發生前的各個變量取值信息以及函數執行位置等),以便被調函數執行完畢後可以順利返
回並繼續執行後續操作。每次調用都需要保存一個場景信息,保存這些場景信息需要的輔助空間的大小
與函數調用的次數呈正比,或者說其空間復雜度是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("1");
    else
    {
        PrintN(n-1);
        printf("%d", n);
    }
}

  

6-1 爆內存函數實例 (6 分)