2013-11-10 29 views
-2

我的函數獲取一個數字並返回包含輸入的輸入之前的數字之和;不過,我想知道是否可以計算從1開始的連續整數之和爲N(輸入)如何使用遞歸函數計算從1開始到n結束的連續整數之和

#include<stdio.h> 
int sum(int x){ 
    if(x>0)return x+sum(x-1); 
    else return 0; 
} 
main(){ 
    int x; 
    scanf("%d",&x);; 
    printf("%d\n\n",sum(x)); 
} 

結束,我發現我的問題的答案,但stackoverflow.com不讓我回答它。所以,我會在這裏回答它:

它非常簡單,它只需要另一個增量參數,另一個跟蹤輸入的值。

#include<stdio.h> 
int sum(int x,int t){ 
    if(t<=x) return t+sum(x,t+1); 
    else return 0; 
} 
main(){ 
    int x; 
    printf("enter int: "); 
    scanf("%d",&x); 
    printf("%d\n",sum(x,0)); 
} 
+4

在哪些方面你的代碼沒有你想要它做什麼? – jwodder

+2

它有一個封閉的數學公式('(x *(x + 1))/ 2')。遞歸不是必需的,但是你寫的看起來好像會起作用。 –

+0

事實上,它的工作原理,但我不知道我是否可以做到這一點從一個輸入,而不使用數學公式。 –

回答

2

所有intergers比n較小的總和,且大於0可以與

int sum = (n*(n+1))/2 

具有比一個遞歸函數的開銷少得多找到。但是,如果你真的想那麼你的功能看起來是正確的,我雖然加入一些大括號:

int sum(int x){ 
    if(x>0) { 
    return x+sum(x-1); 
    } 
    else { 
    return 0; 
    } 
} 

上述功能的問題,是使用堆棧,用於背誦,所以你可能贏得」噸能夠計算大n s。你可以使你的函數尾部遞歸:

int sum(int x, int sum){ 
    if(x>0) { 
    return sum(x-1, sum + x); 
    } 
    else { 
    return sum; 
    } 
} 

這不會使用堆棧來記住你的中間和。然而一個簡單的循環可能會更好,如果你希望它看起來很神祕的,有效的,你可以這樣做:

int sum = (n*(++n))>>1 
+0

您的最後一行有未定義的行爲;目前還不清楚哪個值將被計算出來,編譯器可以產生任何值,並且您不能抱怨。 –

相關問題