递归函数计算一个序列的平方和(并输出过程)

Recursion function to calculate the sum of squares in a sequence (and output the process)

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我遇到了很多麻烦。

我不知道如何在不向函数添加第二个参数(赋值指定一个参数)的情况下正确写出基本情况并得到该基本情况。

如果有人能帮助我,那就太棒了!对不起,如果我没有格式化这个 post 或把它放在错误的部分,第一次 poster.

好的,由于基本条件,您需要知道递归函数中 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);

这应该可以解决您的问题。编码愉快!

这是 javascript 中的实现。

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

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

     }

     SeriesToN(5)
#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
*/

递归函数的实现不是很好,但它完成了工作:

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,只有一个参数,没有任何全局变量。

我为你而来!只需要在单个帧中进行尾部和头部递归。而已。 :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.)
  }

编辑:我不是c++的朋友,如果有任何语法错误,请忽略所有语法错误!

你拥有的是

  • 做这件工作(打印n项),然后剩下的工作(从n-1下降到1

而你想要的是

  • 先做初始工作(从1n-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;
}