2013-11-10 30 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

您的最后一行有未定义的行为;目前还不清楚哪个值将被计算出来,编译器可以产生任何值,并且您不能抱怨。 –

相关问题