我是编程新手,我正在尝试打印fabonacci序列,我不能理解为什么不从while循环条件中减去7就无法得到正确的输出。有谁能告诉我如何解决这个问题。
#include<iostream>
#include<cmath>
using namespace std;
int main (){
double y;
double z;
int x;
cout <<"Enter the number you want to find the sequence of :";
cin>>x;
int zero = 1;
cout<<"Sequence equal to or less than "<<x<<" is :"<<"0";
do {
z = (pow(1.618,zero)-pow(-0.618,zero))/2.236;
zero++;
y=ceil(z);
cout<<","<<y;
} while(y<=x-7);
}发布于 2020-09-03 05:28:27
您“需要”减去7,因为您希望打印的最后一个值小于x,但是您需要在打印后检查条件。有时,放置-7会使打印的最后一个值小于x,但并不总是如此。尝试使用x = 123来获取输出0,1,1,2,3,5,8,13,21,34,55,89,144,或者尝试使用x = 3来获取0,1,而它应该是0,1,1,2,3。
要修复你的代码,首先检查条件,然后再打印出来:
do {
z = (pow(1.618,zero)-pow(-0.618,zero))/2.236;
zero++;
y=ceil(z);
if (y <= x) {
cout<<","<<y;
} else {
break;
}
} while(true);发布于 2020-09-03 07:57:01
问题是这个循环中发生了太多的事情:
int zero = 1;
do {
z = (pow(1.618,zero)-pow(-0.618,zero))/2.236;
zero++;
y=ceil(z);
cout<<","<<y;
} while(y<=x-7);您正在将zero的迭代与y的计算与针对x的检查相结合。拼写每一步都很容易出错,如果循环超过几行,就很难判断发生了什么。如果您的循环没有执行您想要的操作,一个好的方法是通过将其包装在一个函数中来抽象出循环的细节。
例如,简单地重构y的计算,就像这样:
auto fib = [](int zero) {
return ceil((std::pow(1.618,zero) - std::pow(-0.618,zero)) / 2.236);
};你可以使用一个更自然的循环结构来解决这个问题:
for(int zero = 1; (y = fib(zero)) <= x; ++zero)
std::cout<<","<<y;这是一个demo。
这仍然比必要的复杂。在c++20中,您可以声明所有的斐波纳契数:
auto fib_nums = std::views::iota(1) | std::views::transform(fib); 这有一个很好的优点,它可以用于不同的目的,并永远生成斐波那契数。
现在,您的循环可以进行所需的比较:
for(int y : fib_nums | std::views::take_while([x](int y) { return y <= x; }))
std::cout << "," << y;这是一个demo。
https://stackoverflow.com/questions/63713536
复制相似问题