如何解决这个问题,编写一个使用while循环计算前n个Fibonacci数的程序 我对C++编程很陌生,我有点迷路了。下面是我应该做的事情和我的代码。有什么办法吗

如何解决这个问题,编写一个使用while循环计算前n个Fibonacci数的程序 我对C++编程很陌生,我有点迷路了。下面是我应该做的事情和我的代码。有什么办法吗,c++,while-loop,fibonacci,do-while,C++,While Loop,Fibonacci,Do While,编写一个使用while循环计算前n个Fibonacci数的程序。回想一下数学中关于斐波那契序列的以下定义: 斐波那契数Fn的定义如下。对于i=0,1,2,…,F0为1,F1为1,Fi+2=Fi+Fi+1。换句话说,每个数字都是前两个数字的总和。前几个斐波那契数是1、1、2、3、5、8和13 程序应提示用户输入n(斐波那契数),并将结果打印到屏幕上。如果用户为n(n; if(nwhile(in,它试图为n读取一个没有意义的数字。如果你只想打印值,可以在计算值的同一个循环中打印。如果你想把它们存储在

编写一个使用while循环计算前n个Fibonacci数的程序。回想一下数学中关于斐波那契序列的以下定义:

斐波那契数Fn的定义如下。对于i=0,1,2,…,F0为1,F1为1,Fi+2=Fi+Fi+1。换句话说,每个数字都是前两个数字的总和。前几个斐波那契数是1、1、2、3、5、8和13

程序应提示用户输入n(斐波那契数),并将结果打印到屏幕上。如果用户为n(n; if(n
while(i

看看这个循环,这就是问题所在,因为这是家庭作业,我不会确切地告诉你问题是什么,拿支笔和纸,开始执行你的语句,特别是这个循环,你会发现你的错误。只是一个提示,斐波那契数是前两个斐波那契数的和。

你得到了
f2=f0+f1
正确。但是,您应该注意,当您递增
i
时,
f2
变为
f1
f1
变为
f0

如果你这样命名,会更有意义:

int f_i_minus_2 = 0, f_i_minus_1 = 1, f_i;
你会的

f_i = f_i_minus_1+f_i_minus_2;
现在,想象一下
i
是3。你已经写了:

f[3] = f[2]+f[1]
当您递增
i
时,您必须具有:

f[4] = f[3]+f[2]
也就是说,
f_i
被放置在
f_i_减1
的位置,
f_减1
被放置在
f_减2
的位置

(看看这个:

f[3] = f[2] + f[1]
 |       |
  \_____  \____
        \      \
f[4] = f[3] + f[2]
)

因此,在计算完f_i后,您需要两个作业:

f_i_minus_2 = f_i_minus_1;
f_i_minus_1 = f_i;

请注意,我第一次将
f_I_减_2
更改为
f_减_1
,因为第二次赋值破坏了
f_减_1

的值。根据维基百科,您的定义是关闭的。F0=0,F1=1,F2=1,F3=2

假设维基百科是正确的,你的循环基本上是正确的

int i = 0, f, fprev;
while( i < n )
{
    if( i == 0 )
    {
        f = 0;
        fprev = 0;
    }
    else if( i == 1 )
    {
        f = 1;
    }
    else
    {
        int fnew = f + fprev;
        fprev = f;
        f = fnew;
    }
    i++;
}
inti=0,f,fprev;
而(i
如果您感兴趣,则有。

正如其他人所指出的,因为您从未在中修改
f0
f1
循环,
f2
不取决于通过 循环。由于您必须在末尾输出所有数字, 为什么不尝试将它们保存在一个数组中呢?我会初始化前两个 手动设置值,然后循环,直到有足够的值为止

(这可以使用STL很好地完成:

//  After having read n...
std::vector<int> results( 2, 1 );
while ( results.size() < n )
    results.push_back( *(results.end() - 1) + *(results.end() - 2));
//读过n之后。。。
std::矢量结果(2,1);
while(results.size()
然而,我不确定这是否是你的导师想要的。 我很怀疑他想让你自己做点什么 请记住,如果手动初始化前两个值,则 索引必须从2开始,而不是从0开始。)

另一件事:您发布的规范说,如果 用户输入非法值。这实际上有点棘手:如果 用户输入的内容不是
int
(说“abc”),然后输入1)
std::cin
将保持错误状态(所有进一步的输入将失败) 直到清除(通过调用
std::cin.clear()
)和非法 字符将不会从流中提取,因此您需要进行下一次尝试 将失败,直到您删除它们。(我建议将
>
插入
std::string
用于此;这将删除所有内容,直到下一个白色 空格)之前,请不要访问您输入的变量 如果输入失败,您已检查流是否失败。如果 输入失败,输入的变量未被修改 如果没有初始化它,那么任何事情都可能发生

最后(我相信这超出了你的任务范围),你真的做到了 需要做点什么来检查溢出。超过某个点, 您的输出或多或少会变得随机;最好停止并
在这种情况下,您将放弃的输出。

不,这是他们新的基于云的社交网络和衍生品交易应用程序的关键代码。@David:考虑到“…不是像Lab 2那样的if语句”之类的评论被留在了,很可能是这样。@Orbling:duh,不确定我怎么会错过它:(斐波那契不是正常地使用递归吗?我在这里看不到类似的东西。@Luis:家庭作业在这里不是绝对反对的——尽管人们喜欢看到它a)陈述,b)看看你取得了什么进步,这样他们就可以指导你,而不是告诉你。谢谢你,我会尝试一下,很快让你知道它是否有效。再次感谢你。只要看看你的答案,是的,这是有意义的,让我们看看当我尝试修复它时会发生什么。谢谢你另一个无关的注意事项是,在你的程序结束时,不要打印
f_I
,你说的是
cin>>n
,它试图为
n
读取一个没有意义的数字。如果你只想打印值,可以在计算值的同一个循环中打印。如果你想把它们存储在某个地方,你应该先
新建
足够的内存,然后通过设置
arr[0]来填充内存=0;
arr[1]=1;
然后检查i(从
2
n
)并设置
arr[i]=arr[i-1]+arr[i-2];
不需要我告诉你的技巧,因为你已经在数组中前进了。要打印它,你需要另一个
for
来遍历数组并逐个打印值。
int i = 0, f, fprev;
while( i < n )
{
    if( i == 0 )
    {
        f = 0;
        fprev = 0;
    }
    else if( i == 1 )
    {
        f = 1;
    }
    else
    {
        int fnew = f + fprev;
        fprev = f;
        f = fnew;
    }
    i++;
}
//  After having read n...
std::vector<int> results( 2, 1 );
while ( results.size() < n )
    results.push_back( *(results.end() - 1) + *(results.end() - 2));