RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1227727
Accepted
n1tr0xs
n1tr0xs
Asked:2022-01-06 08:47:36 +0000 UTC2022-01-06 08:47:36 +0000 UTC 2022-01-06 08:47:36 +0000 UTC

C++ 中生成器的 Python 类似物

  • 772

是否有可能以某种方式使 C++代码以某种方式类似于中的代码工作,这些代码python称为生成器,“而不发明新的相对论”。

例如,斐波那契数列:

def fib():
    f = 1
    s = 0
    while True:
        yield s
        f, s = s, s+f

k = fib()
for i in range(10):
    print(next(k))

我试过这个,但我认为还有一些更“正确”的选择?

int fib(){
    static int f=1, s=0;
    int t=f;
    f = s;
    s += t;
    return s;
}

int main(){
    for(int i=0; i<10; ++i)
        cout << fib() << ' ';
    return 0;
}

至少,我的对手是“一次性”(你不能再次开始这个序列)。

python
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Vladimir Gamalyan
    2022-01-06T09:09:31Z2022-01-06T09:09:31Z

    例如像这样(创建一个对象实例并使用函数调用运算符):

    class Fib {
    public:
        int operator()()
        {
            int t = f;
            f = s;
            s += t;
            return s;
        }
    private:
        int f = 1;
        int s = 0;
    };
    
    int main() {
        Fib k;
        for (int i = 0; i < 10; ++i)
            std::cout << k() << ' ';
    }
    
    • 6
  2. Павел Ериков
    2022-01-06T09:29:03Z2022-01-06T09:29:03Z

    这就是我会做的:)

    #include <iostream>
    using namespace std;
    class Fibonacci {
    private:
        int first = 1;
        int second = 0;
        int index = 0;
    public:
        int operator++() {
            int t = first;
            first = second;
            second += t;
            ++index;
            return second;
        }
        int operator--() {
            if (index <= 0) {
                index = 0;
                first = 1;
                second = 0;
                return second;
            }
            int t = second - first;
            second = first;
            first = t;
            --index;
            return second;
        }
    };
    
    int main() {
        Fibonacci fib;
        for (int i = 0; i < 10; ++i)
            cout << ++fib << " ";
        cout << endl;
    
        for (int i = 0; i < 12; ++i)
            cout << --fib << " ";
        cout << endl;
        return 0;
    }
    

    结果:

    1 1 2 3 5 8 13 21 34 55
    34 21 13 8 5 3 2 1 1 0 0 0
    

    getByIndex您可以按类型、各种转换等添加各种功能。您还可以制作类模板,然后使用长数字,例如ullong int. 可以进行任何溢出检查。

    • 5
  3. Vladimir Gamalyan
    2022-01-06T14:48:56Z2022-01-06T14:48:56Z

    在不久的将来(以及现在的 Visual Studio 用户,如果您启用最新 C++ 工作草案中的功能),您可以使用更多规范生成器(使用co_yield 关键字):

    #include <iostream>
    #include <coroutine>
    #include <experimental/generator>
    
    std::experimental::generator<double> fibonacci(const double ceiling) {
        double j = 0;
        double i = 1;
        co_yield j;
        if (ceiling > j) {
            do {
                co_yield i;
                double tmp = i;
                i += j;
                j = tmp;
            } while (i <= ceiling);
        }
    }
    
    int main() {
        for (const auto v: fibonacci(100))
            std::cout << v << ' ';
    }
    

    (示例在 Visual Studio 2019 中构建,启用了最新 C++ 工作草案中的功能,输出 0 到 100 范围内的斐波那契数)

    • -1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5