我们如何使用C中的递归打印1 + 11 +111 + ........系列的总和达到N个项

Rab*_*ari 2 c algorithm recursion function

我已经尝试使用递归连续打印这个系列的总和但最终只返回它的第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));
}
Run Code Online (Sandbox Code Playgroud)

你可以在不使用for循环的情况下帮助我吗?

在此先感谢您的回答!

Dan*_*tin 6

所以,如果你手工做这个,你会怎么做?

那么,手工编写你可能会写下每个术语:

1 + 11 + 111 + 1111 + 11111 + 111111
Run Code Online (Sandbox Code Playgroud)

然后你开始服用和:1 + 11 = 12,12 + 111 = 123,123 + 1111 = 1234等.

当然,你也可以采取的金额倒退:111111 + 11111 = 122222,122222 + 1111 = 123333,等.

为了通过递归攻击它,您需要仔细计划函数返回的内容及其参数.

在这个问题中,您需要计算两件事:实际的系列术语(1,11,111,1111等)以及这些术语的总和.您的函数名称很清楚,您打算sumseries返回系列的总和.

现在,你似乎已经掌握了从当前术语开始下一个术语的方法(乘以10并加1),但这对递归没有帮助.

如果你有办法说"当前术语"添加到"剩下的东西的总和",但是,你将走向递归解决方案.

那么如果你的函数有两个参数:一个n说明要写多少个术语,一个current_term变量给出当前术语呢?

然后你可以在你的部分功能中做到这一点:

next_term = 10 * current_term + 1
return current_term + sumseries(n-1, next_term);
Run Code Online (Sandbox Code Playgroud)

事实上,这是它的核心:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后将呼叫更改mainsumseries(n, 1)而不仅仅是sumseries(n)