#c #recursion
#c #рекурсия
Вопрос:
Следующая программа на 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", amp;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;
}
Как я могу показать моделирование рекурсии для n = 5 в моем коде?
Комментарии:
1. Показать это каким образом? Может быть, просто добавить
printf()
вызовы функции?2. Вам нужно переписать функцию, чтобы она была более подробной, например
a=pow(); b=2*n 1; c=addNumbers(); result=a*b c;
, тогда вы можете печатать все, что хотите, прежде чем возвращать результат.
Ответ №1:
Перед возвратом 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",a,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", amp;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",a,b);
else
printf("(%d x %d) ",a,b);
}
return sum;
}
int main()
{
int n;
printf("Enter a positive integer n: ");
scanf("%d", amp;n);
tmp=n;
printf("Sum = %dn", 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
Комментарии:
1. Ваше моделирование подхода снизу вверх не выдает 289 в качестве выходных данных, когда я ввожу n = 5
2. Оба кода дают мне тот же результат 289. Не могли бы вы проверить еще раз? В то время как логика кода также одинакова
Ответ №2:
Самый простой способ отследить рекурсию — вставить несколько 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 = %dn", term, sum); //
return sum;
}
else
{
printf("= %dn", 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 = %dn", term, sum); //
*p *= 2;
return sum;
}
else
{
printf("= %dn", n); //
return n;
}
}
int addNumbers(int n){
int p = 1;
return addMulNumbers(n, amp;p);
}