如何打印系列1+;11+;111+;。。。。。。。。C语言中使用递归的多达N个术语
我一直试图使用递归打印这个系列的总和,但最终只返回了它的第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("
#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