Обратная последовательность Фибоначчи - PullRequest
0 голосов
/ 24 октября 2018

Мне была назначена задача, в которой я должен создать обратную последовательность Фибоначчи.Он должен сходиться, когда отношение составляет -3.23607.Я не уверен, почему он не выдаст num, но я думаю, что это как-то связано с моим циклом while.Заранее спасибо.

#include <iostream>
using namespace std;

void reverseFibonacci(int*, int*);


// Driver function 
int main()
{
int a, b;
int *ptr_1 = &a;
int *ptr_2 = &b;
cout << "what are points 1 and 2?" << endl;
cin >> *ptr_1 >> *ptr_2;
reverseFibonacci(ptr_1, ptr_2);
return 0;
}

void reverseFibonacci(int *a, int *b)
{
int *ptr1 = a;
int *ptr2 = b;
int c = *ptr1 - *ptr2;
int *ptr3 = &c;


int num = 0;


do
{
    *ptr3 = *ptr1-*ptr2;
    *ptr2 = *ptr1;
    *ptr1 = *ptr3;
    num++;
} while (((*ptr1 / *ptr2) + (*ptr2 / *ptr3)) >= -3.23607);

cout << num << endl;

int *q = new int[num];

for (int f = 0; f < num; f++)
{
    q[f] = *ptr1;
    q[f + 1] = *ptr2;
    c = *a - *b;
    *b = *a;
    *a = c;
}


for (int j = num - 1; j >= 0; j--) 
{
    cout << q[j] << " ";
}

delete[] q;
}

1 Ответ

0 голосов
/ 24 октября 2018

В вашем коде есть несколько проблем.Например, в расчете (* ptr1 / * ptr2) + (* ptr2 / * ptr3)) вы делите int, поэтому вы получаете целое число, а не двойное, как я предполагаю.

Были также некоторыеошибки в вычислениях термина (я предполагаю, что 'a' - первый член в обратной серии, простите, если я ошибаюсь).Для расчета таблицы q [] вы рассчитываете только q [0] и q [1].Я исправил это, предполагая, что это q [] соответствует ряду Фибоначчи в прямом порядке.

Я не думаю, что необходимо использовать указатели на int вместо int.Я изменил его, но, возможно, это не ваш выбор.

Я вставил запись некоторых промежуточных значений: я использовал их для исправления кода.Я позволил им показать вам возможный способ отладки программы.Я также использовал вектор вместо массива C.Вам будет легко вернуться к массиву, если вам это нужно.Кроме того, я старался следовать вашему собственному коду и не изменять все.

Поскольку я, возможно, изменил значение ptr1 и ptr2, пожалуйста, проверьте, что вычисление теста сходимости («коэффициент») все еще верно.

Вот код, похоже, работает:

#include <iostream>
#include <vector>
using namespace std;

void reverseFibonacci(int, int);
int main()
{
    int a, b;
    cout << "what are points 1 and 2?" << endl;
    cin >> a >> b;
    reverseFibonacci(a, b);
    return 0;
}

void reverseFibonacci(int a, int b)
{
    const int num_max = 100;
    int ptr1 = a;
    int ptr2 = b;
    int ptr3;

    cout << "a = " << a << "\tb = " << b << "\n";
    int num = 0;
    double ratio;
    do
    {
        ptr3 = ptr1-ptr2;
        ptr1 = ptr2;
        ptr2 = ptr3;
        if ((ptr2 != 0) && (ptr3 != 0))
            ratio = static_cast<double> (ptr1) / ptr2 + static_cast<double>(ptr2) / ptr3;
        else
            ratio = -100.0; 
        cout << "num = " << num << "\t\tptr2 = " << ptr2 << "\t\tptr1 = " << ptr1 << "\t\tratio = " << ratio<< endl;
        num++;
    } while ((ratio >= -3.23607) && (num < num_max));

    cout << "num = " << num << endl;
    int n = num + 2;
    vector<int> q(n);
    for (int f = 0; f < n; f++)
    {
        q[f] = ptr2;
        ptr3 = ptr1 + ptr2;
        ptr2 = ptr1;
        ptr1 = ptr3;
    }
    cout << "Fibonacci series in direct order:\n";
    for (auto j : q) 
    {
        cout << j << " ";
    }
    cout << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...