如何打印系列1+;11+;111+;。。。。。。。。C语言中使用递归的多达N个术语

如何打印系列1+;11+;111+;。。。。。。。。C语言中使用递归的多达N个术语,c,algorithm,function,recursion,C,Algorithm,Function,Recursion,我一直试图使用递归打印这个系列的总和,但最终只返回了它的第n个项。我知道如何使用迭代打印序列的和,但是使用递归打印它的和对我来说太难了 经过深思熟虑,我最终得出了这段代码 #include <stdio.h> int sumseries(int); int main() { int n; printf("Enter the number: "); scanf("%d",&n); printf("

我一直试图使用递归打印这个系列的总和,但最终只返回了它的第n个项。我知道如何使用迭代打印序列的和,但是使用递归打印它的和对我来说太难了

经过深思熟虑,我最终得出了这段代码

#include <stdio.h>
int sumseries(int);
int main()
{
    int n;
    printf("Enter the number: ");
    scanf("%d",&n);
    printf("The sum of the series is %d",sumseries(n));
}
int sumseries(int n)
{
    int i,sum=0;
    if(n==1)
        return 1;
    for(i=0;i<n;i++)
        sum=sum*10+1;
    return (sum+sumseries(n-1));
}
#包括
int系列(int);
int main()
{
int n;
printf(“输入数字:”);
scanf(“%d”和“&n”);
printf(“系列之和为%d”,系列(n));
}
int SUM系列(int n)
{
int i,和=0;
如果(n==1)
返回1;

对于(i=0;i那么,如果你用手做这个,你会怎么做

好吧,用手你可能会把每个术语都写下来:

1 + 11 + 111 + 1111 + 11111 + 111111
然后开始求和:
1+11=12
12+111=123
123+1111=1234
,等等

当然,你也可以把总和倒过来:
111111+11111=122222
122222+1111=123333
,等等

为了用递归解决这个问题,您需要仔细规划函数返回的内容及其参数

在这个问题中,您需要计算两件事:实际的序列项(1、11、111、1111等)和这些项的总和。从函数的名称可以清楚地看出,您打算返回序列的总和

现在,您似乎已经掌握了从当前项生成下一项的方法(乘以10,再加1),但这对递归没有帮助

不过,若你们有办法说“当前项”加在“剩余部分的总和”上,那个么你们就可以找到一个递归的解决方案了

那么,如果你的函数有两个参数:一个表示要写多少个术语的
n
,一个表示当前术语的
current\u term
变量,会怎么样呢

然后,您可以在功能的一部分中执行此操作:

next_term = 10 * current_term + 1
return current_term + sumseries(n-1, next_term);
事实上,这是它的核心:

int sumseries(int n, int current_term)
{
    if(n==1)
        return current_term;
    next_term = 10 * current_term + 1
    return current_term + sumseries(n-1, next_term);
}

然后将
main
中的调用更改为
sumseries(n,1)
,而不仅仅是
sumseries(n)

我们初学者应该互相帮助。:)

给你

#include <stdio.h>

unsigned long long int series_sum( unsigned int n )
{
    static unsigned long long int value;
    const unsigned long long int Base = 10;

    unsigned long long int sum = 0;

    if ( n )
    {
        value = Base *value + 1;
        sum += series_sum( n - 1 ) + value;
        value /= Base;
    }

    return sum;
}

int main( void )
{
    const unsigned int N = 10;

    for ( unsigned int i = 0; i < N; i++ )
    {
        printf( "series_sum( %u ) = %llu\n", i, series_sum( i ) );
    }

    return 0;
}

正如您所看到的,函数只有一个必需的参数。此外,最好使用类型
unsigned int
作为参数类型(否则您必须检查参数是否为负),并使用类型
unsigned long int
作为返回类型,因为类型
int
(或
无符号整数
)太小,无法保持和。

for循环并不意味着不使用递归。你的解决方案不是最好的,但它仍然是一个解决方案。哇,你们怎么不让数学操纵你!这很好,也许,首先得到结束数并反向工作。如果n=4,将1111输入递归函数并保持“松弛”一的项,直到值=0。然后您知道返回的时间。“n”的最大值将略小于14,以避免整数溢出
series_sum( 0 ) = 0
series_sum( 1 ) = 1
series_sum( 2 ) = 12
series_sum( 3 ) = 123
series_sum( 4 ) = 1234
series_sum( 5 ) = 12345
series_sum( 6 ) = 123456
series_sum( 7 ) = 1234567
series_sum( 8 ) = 12345678
series_sum( 9 ) = 123456789