输出序列的第n个元素

时间:2015-03-22 16:07:14

标签: c++ sequence

所以here是任务。 我尝试使用这段代码:

#include <iostream>
#include <istream>
#include <conio.h>
#include <math.h>
using namespace std;

int main(){
    int i, n;
    cout<<"enter n ";
    cin>>n;
    if(n==1||n==2){
            i=1;
            cout<<"\n your number "<<i;
        } 
    else {
        for(i=3;i<=n;i++){
            i=(i-1)-4*(i-2);
        }
        cout<<"\n your number"<<i;
    }
    getch();
}

当输入1或2时,我得到: &#34;您的号码1&#34; 。但是当我输入3,5或9时,我得到: &#34;你的号码11&#34;

  • 哪里出错?
  • 而且我无法使用大量的任务, 因为大块的大小必须是常数。不变 的 名词即可。我是对的吗?

抱歉我的英文。

2 个答案:

答案 0 :(得分:0)

我认为你有-3票,因为你希望我们在你的代码中找到错误。

至于你的问题,你可以使用递归:

int f(int x)
{
if(x==1||x==2)
    return 1;
else
    return =f(x-1)-4*(x-2);
}
int main(){
int x;
cin>>x;
cout<<f(x);
}

我建议您在每个术语时按顺序使用递归,但是第一个术语的某些部分取决于之前的术语。

递归将为所有术语调用该函数,并将结果添加到内存中的堆栈。它比你的方式慢;特别是如果你想找到一个以上学期的答案。但在这里我觉得它更合适。

如果您认为int对于结果来说太小,则可以使用long long代替。

答案 1 :(得分:0)

您尝试解决任务的方式不正确。你只在内存中保留2个最后计算的元素,让x(i-1)为a,x(i-2)为b。然后你计算你的下一个值,在下一次迭代时很好是x(i - 1)+将前一个x(i-1)移动到x(i-2) - 所以你的算法只使用恒定的内存量。这是代码:

int calc(int n) {
  int a = 1, b = 1;
  for(n -= 2; n > 0; --n) {
      int tmp = a - 4 * b;
      b = a;
      a = tmp;
  }
  return a;
}