Функция рекурсии для вычисления суммы квадратов в последовательности (и вывода процесса) - PullRequest
0 голосов
/ 27 февраля 2020
int SeriesToOne(int n) {
   if (n == 1) {
       cout << "(" << 1 << "*" << 1 << ") = ";
       return 1;
   }
   cout << "(" << n << "*" << n << ") + ";
return (n * n) + SeriesToOne(n - 1); }

Привет, я пишу программу, которая должна вычислять сумму квадратов в последовательности с использованием рекурсии.

Я пишу две функции, одна из которых вычисляет значение от 1 до N, а другая - от N до 1, и выводит процесс. Приведенный выше код является функцией, которую я написал для N к 1, но у меня много проблем с переходом от 1 к N.

Я не знаю, как правильно выписать базовый случай и добраться до этого базового случая, не добавляя второй аргумент в функцию (присваивание указывает один аргумент).

Если бы кто-нибудь мог мне помочь, это было бы здорово! И извините, если я не отформатировал этот пост или не поместил его в неправильный раздел, первый постер.

Ответы [ 6 ]

0 голосов
/ 27 февраля 2020

То, что у вас есть,

  • выполните эту работу (напечатайте термин n), затем оставшуюся работу (от n-1 до 1)

и вы хотите, чтобы

  • сначала выполняли начальную работу (от 1 до n-1), затем эту часть работы (напечатайте термин n)

Сохраните результат рекурсии в переменной (и оставьте бит = для main, который отвечает за печать результата):

int SeriesToOne(int n) {
    if (n == 1) {
        cout << "(" << 1 << "*" << 1 << ")";
        return 1;
    }
    cout << "(" << n << "*" << n << ") + ";
    int sum = (n * n) + SeriesToOne(n - 1);
    return sum;
}

и затем вы можете изменить рабочее задание (и переместить вывод +):

int SeriesFromOne(int n) {
    if (n == 1) {
        cout << "(" << 1 << "*" << 1 << ")";
        return 1;
    }
    int sum = (n * n) + SeriesFromOne(n - 1);
    cout << " + (" << n << "*" << n << ")";
    return sum;
}
0 голосов
/ 27 февраля 2020

я за тебя! просто нужно сделать хвостовую и головную рекурсию в одном кадре. это оно. : D

Вы можете использовать следующий фрагмент кода:

int SeriesToOne(int n) {
  if (n == 0) return 0;

   cout<<endl<<n+" : "+(n * n);


   int sum = 0;
   sum += n * n;
   sum += seriesToOne(n-1); // due to loose overhead when n will become 0.

   cout<<endl<<n+" : "+(n * n);

   sum += n * n;

   return sum; // return the total sum we get after two functionality (tail-head recur.)
  }

edit: я не являюсь другом c ++, игнорируйте все ошибки синтаксиса, если что-то было!

0 голосов
/ 27 февраля 2020

Это не очень хорошая реализация для рекурсивной функции, но она выполняет свою работу:

int SeriesToN(int n) {
    static int N = n;
    static bool firstTime = true;
    if (n == N && !(firstTime)) {
        cout << "(" << n << "*" << n << ") = ";
        return (n*n);
    }
    else {
        if (n == N) {
            firstTime = false;
            n = 1;
        }
        cout << "(" << n << "*" << n << ") + ";
        return (n * n) + SeriesToN(n + 1);
    }
}

Она рассчитывает от 1 до n, как вы пожелаете, только с одним аргументом и без каких-либо глобальных переменных.

0 голосов
/ 27 февраля 2020
#include <iostream>
#include <string>

using namespace std;

int SeriesToN(int n, int limit = -1) 
{   
    // catch edge cases
    if (n == 1) {
        cout << "(1 * 1) = ";
        return 1;
    } else if (n <= 0) {
        cout << "n should be >= ";
        return 1;
    }

    // the actual action
    if (limit == 0) 
    {
        cout << "(" << n << "*" << n << ") = ";
        return n * n;
    } else if (limit == -1) // handling one argument input
    {
        limit = n - 1;
        n = 1;
        cout << "(" << 1 << "*" << 1 << ") + ";
        return (1) + SeriesToN(2, limit - 1);         
    } else
    {   
        cout << "(" << n << "*" << n << ") + ";
        return (n * n) + SeriesToN(n + 1, limit - 1); 
    }
};


int main()
{
    cout << SeriesToN(10);
    cout << "\n";
    cout << SeriesToN(3);
    cout << "\n";
    cout << SeriesToN(2);
    cout << "\n";
    cout << SeriesToN(1);
    cout << "\n";
    cout << SeriesToN(0);
    cout << "\n";
    cout << SeriesToN(-1);
    cout << "\n";
    return 0;
}

/* output:
(1*1) + (2*2) + (3*3) + (4*4) + (5*5) + (6*6) + (7*7) + (8*8) + (9*9) + (10*10) = 385
(1*1) + (2*2) + (3*3) = 14
(1*1) + (2*2) = 5
(1 * 1) = 1
n should be >= 1
n should be >= 1
*/
0 голосов
/ 27 февраля 2020

Это реализация в javascript.

function SeriesToN(n, initialCount){
       if(!initialCount){
                initialCount  = 1;
              }
       if(initialCount === n){
            return n * n ;
         }

        return (initialCount * initialCount) + SeriesToN(n , initialCount + 1)

     }

     SeriesToN(5)
0 голосов
/ 27 февраля 2020

Хорошо, так как вам нужно знать значение n внутри функции рекурсии из-за базового условия, вы можете либо объявить переменную как глобальную, либо передать ее функции в каждом вызове, как показано ниже:

int SeriesToN(int n, int N) {
    if (n == N) {
        cout << "(" << n << "*" << n << ") = ";
        return n * n;
    }
    cout << "(" << n << "*" << n << ") + ";
    return (n * n) + SeriesToN(n + 1, N); 
}

Затем вызовите функцию следующим образом, если n = 4:

SeriesToN(1, 4);

Это должно решить вашу проблему. Удачного кодирования!

...