首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我需要从while条件中减去7,代码才能正常工作

为什么我需要从while条件中减去7,代码才能正常工作
EN

Stack Overflow用户
提问于 2020-09-03 05:05:14
回答 2查看 68关注 0票数 0

我是编程新手,我正在尝试打印fabonacci序列,我不能理解为什么不从while循环条件中减去7就无法得到正确的输出。有谁能告诉我如何解决这个问题。

代码语言:javascript
复制
#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);
}
EN

回答 2

Stack Overflow用户

发布于 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

要修复你的代码,首先检查条件,然后再打印出来:

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2020-09-03 07:57:01

问题是这个循环中发生了太多的事情:

代码语言:javascript
复制
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的计算,就像这样:

代码语言:javascript
复制
auto fib = [](int zero) {
    return ceil((std::pow(1.618,zero) - std::pow(-0.618,zero)) / 2.236);
};

你可以使用一个更自然的循环结构来解决这个问题:

代码语言:javascript
复制
for(int zero = 1; (y = fib(zero)) <= x; ++zero)
        std::cout<<","<<y;

这是一个demo

这仍然比必要的复杂。在c++20中,您可以声明所有的斐波纳契数:

代码语言:javascript
复制
auto fib_nums = std::views::iota(1) | std::views::transform(fib); 

这有一个很好的优点,它可以用于不同的目的,并永远生成斐波那契数。

现在,您的循环可以进行所需的比较:

代码语言:javascript
复制
for(int y : fib_nums | std::views::take_while([x](int y) { return y <= x; }))
    std::cout << "," << y;

这是一个demo

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63713536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档