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