问题描述
以下 C 语言程序将 n 作为输入,并使用递归查找直到第 n 项的系列之和。该系列如下: (1 x 3) + (2 x 5) + (4 x 7) + (8 x 9) + ... + 第 n 项
这是我的代码:
#include <stdio.h>
#include <math.h>
int addNumbers(int n);
int main(){
int n;
printf("Enter a positive integer n: ");
scanf("%d",&n);
printf("Sum = %d",addNumbers(n));
return 0;
}
int addNumbers(int n){
if (n>0)
return pow (2,n-1)*(2*n+1)+addNumbers(n-1);
else
return n;
}
解决方法
跟踪递归的最简单方法是插入一些 printf
语句。
int addNumbers(int n){
if (n > 0)
{
int term = pow(2,n - 1) * (2 * n + 1); // = (1 << (n - 1)) * (2 * n + 1)
int sum = term + addNumbers(n - 1);
printf("+ %d = %d\n",term,sum); // +++
return sum;
}
else
{
printf("= %d\n",n); // +++
return n;
}
}
使用 n = 5
输出:
= 0
+ 3 = 3
+ 10 = 13
+ 28 = 41
+ 72 = 113
+ 176 = 289
Sum = 289
您还可以通过使用递归的变体来计算幂次,从而摆脱 pow
调用(这是危险的、昂贵的并且不必要地使用浮点数)。
int addMulNumbers(int n,int *p){
if (n > 0)
{
int mul = addMulNumbers(n - 1,p);
int term = *p * (2 * n + 1);
int sum = term + mul;
printf("+ %d = %d\n",sum); // +++
*p *= 2;
return sum;
}
else
{
printf("= %d\n",n); // +++
return n;
}
}
int addNumbers(int n){
int p = 1;
return addMulNumbers(n,&p);
}
,
在返回 pow(2,n-1)*(2*n+1)+addNumbers(n-1)
操作之前,您可以打印以获得模拟。由于这里使用的是自顶向下过程递归,因此您的模拟也会影响自顶向下方法。
#include <stdio.h>
#include <math.h>
int addNumbers(int n)
{
if (n>0){
int a=pow(2,n-1);
int b=2*n+1;
if(n>1)
printf("(%d x %d) + ",a,b);
else
printf("(%d x %d)\n",b);
return pow(2,n-1)*(2*n+1)+addNumbers(n-1);
}
else
return n;
}
int main()
{
int n;
printf("Enter a positive integer n: ");
scanf("%d",&n);
printf("Sum = %d",addNumbers(n));
return 0;
}
输出
Enter a positive integer n: 5
(16 x 11) + (8 x 9) + (4 x 7) + (2 x 5) + (1 x 3)
Sum = 289
如果您想进行自下而上的进场模拟,请执行此操作。
int sum=0,tmp;
int addNumbers(int n)
{
if (n>0){
sum+=pow(2,n-1)*(2*n+1)+addNumbers(n-1);
int a=pow(2,n-1);
int b=2*n+1;
if(tmp==n)
printf("(%d x %d)\n",b);
else
printf("(%d x %d)+ ",b);
}
return sum;
}
int main()
{
int n;
printf("Enter a positive integer n: ");
scanf("%d",&n);
tmp=n;
printf("Sum = %d\n",addNumbers(n));
return 0;
}
输出
Enter a positive integer n: 5
(1 x 3)+ (2 x 5)+ (4 x 7)+ (8 x 9)+ (16 x 11)
Sum = 289