c++ - 使用两个线程计算斐波那契数列。

标签 c++ c++builder

我有这个代码:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { }

int Fibonacci(int nNumber) {
    if (nNumber == 0)
        return 0;
    if (nNumber == 1)
        return 1;

    return Fibonacci(nNumber-1) + Fibonacci(nNumber-2);
}

void __fastcall TForm1::Button1Click(TObject *Sender) {
    int k=0;
    int val;

    k = StrToInt(Edit1->Text);

    for (int i=0; i < k; i++) {
        val =  Fibonacci(i);
        Form1->ListBox1->Items->Add("F"+IntToStr(i)+"-->"+IntToStr(val));
    }
}

我如何创建 2 个线程来分别计算和打印斐波那契数列的偶数和奇数索引数?

这是 Builder 6 中的练习。

最佳答案

您可以使用仅使用偶数或奇数元素的斐波那契数列公式。要开发此公式:

f(n) = f(n-1) + f(n-2) [1]
f(n-1) = f(n-2) + f(n-3) [2]
f(n-2) = f(n-3) + f(n-4) [3]

Combining [1] and [2]:
f(n) = 2 * f(n-2) + f(n-3) [4]

Rearranging [3]:
f(n-3) = f(n-2) - f(n-4) [5]

Combining [4] and [5]:
f(n) = 3 * f(n-2) - f(n-4) [6]

现在每个线程都可以使用 [6] 计算偶数或奇数斐波那契数,而无需等待其他线程的结果。

int Fibonacci(int nNumber) {
    switch (nNumber)
    {
    case 0: return 0;
    case 1: return 1;
    case 2: return 1;
    case 3: return 2;
    default: return 3 * Fibonacci(nNumber-2) - Fibonacci(nNumber-4);
    }
}

但是,这可能会破坏您的练习,使事情比预期的简单得多。

关于c++ - 使用两个线程计算斐波那契数列。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573076/

相关文章:

c++ - 对象映射的 vector

delphi - TWebBrowser (TEmbeddedWB) 控件中的拼写检查器

delphi - TInterfacedObject 自动内存管理也可以与 C++Builder 一起使用吗?

c++ - 读取文件并将其存储在 C++ 中的 protected 变量中

c++ - 替代 vector <bool>

c++ - 单击另一个小部件时将小部件标记为未选中

delphi - 使用框架时有没有办法拥有类似 KeyPreview 的功能?

c++ - 从静态构造函数代码调用时 pthread 库失败

components - 如何备份我的 C++ Builder 组件安装?

delphi - 如何使用诸如乘法之类的混合模式来填充矩形,而不仅仅是简单的透明度