我一直尝试使用递归来打印这个系列的总和但最终只返回它的第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));
}
你可以在不使用for循环的情况下帮助我吗?
提前感谢您的回答!
答案 0 :(得分:5)
所以,如果你是手工做,你会怎么做?
嗯,手动你可能会写下每个词:
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等)以及这些术语的总和。您的函数名称很清楚,您希望sumseries
返回系列的总和。
现在,你似乎已经掌握了从当前术语开始下一个术语的方法(乘以10并加1),但这对递归没有帮助。
如果你有办法说“当前术语”被添加到“其他东西的总和”中,那么你就会走向递归解决方案。
那么,如果你的函数有两个参数:一个n
表示要写入多少个术语,一个current_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)
答案 1 :(得分:1)
我们初学者应该互相帮助。:)
你在这里。
#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;
}
程序输出
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
如您所见,该功能只有一个参数。另外最好使用类型unsigned int
作为参数的类型(否则你必须检查参数是否为负)和类型unsigned long long int
作为返回类型,因为类型{{1} }(或int
)太小而无法保留总和。