нужна помощь в исправлении моего кода для последовательности Фибоначчи - PullRequest
0 голосов
/ 02 мая 2019

Мне нужно создать программу, которая запрашивает у пользователя целое число N, а затем распечатывает первые N членов последовательности Фибоначчи, используя функцию void для последовательности Фибоначчи. После одного экземпляра программа должна спросить пользователя, желает ли он продолжить. Если пользователь отвечает Y, программа должна запросить у него другое целое число N, а затем распечатать первые N членов последовательности Фибоначчи и так далее.

Я уже написал код для этого. Это работает в первую очередь. Проблема в том, что, если пользователь решит сделать это снова, результат больше не будет правильной последовательностью Фибоначчи. Ниже приведен код.

#include<stdio.h>

void printFibonacci(int n){
    static int n1=0,n2=1,n3;
    if(n>0){
         n3 = n1 + n2;
         n1 = n2;
         n2 = n3;
         printf("%d ",n3);
         printFibonacci(n-1);
    }
}

int main()
{
    int n;
    char choice;
    printf("Enter the number of elements: ");
    scanf("%d",&n);
    printf("Fibonacci Series: ");
    printf("%d %d ",0,1);
    printFibonacci(n-2);//n-2 because 2 numbers are already printed

    printf("\nDo you wish to continue?(Y/N)");
    scanf(" %c", &choice);

    while (choice=='Y')
    {
        printf("Enter the number of elements: ");
    scanf("%d",&n);
    printf("Fibonacci Series: ");
    printf("%d %d ",0,1);
    printFibonacci(n-2);//n-2 because 2 numbers are already printed

    printf("\nDo you wish to continue?(Y/N)");
    scanf(" %c", &choice);
    }
  return 0;
 }


Ожидаемый результат - последовательность Фибоначчи. Когда я запускаю приведенный выше код, в первом случае, если я говорю N = 5, это дает правильный результат: 0,1,1,2,3. Проблема возникает после того, как я отвечаю «Да» на «Вы хотите продолжить? (Да / Нет)». Если я снова введу N = 5, я ожидаю получить 0,1,1,2,3, но вместо этого я получу 0,1,5,8,13.

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Мы можем сохранить сигнатуры вашей функции, добавив регистр else к printFibonacci(), чтобы сбросить его статические переменные, когда n == 0:

#include <stdio.h>

void printFibonacci(int n) {
    static int n1 = 0, n2 = 1, n3;

    if (n > 0) {
        n3 = n1 + n2;
        n1 = n2;
        n2 = n3;
        printf("%d ", n3);
        printFibonacci(n - 1);
    } else {
        n1 = 0;
        n2 = 1;
    }
}

int main()
{
    int n;
    char choice = 'Y';

    while (choice == 'Y')
    {
        printf("Enter the number of elements: ");
        scanf("%d", &n);
        printf("Fibonacci Series: ");
        printf("%d %d ", 0, 1);
        printFibonacci(n - 2); // n - 2 because 2 numbers are already printed
        printf("\n");

        printf("Do you wish to continue? (Y/N): ");
        scanf(" %c", &choice);
    }

    return 0;
}

Не мой первый выбор, но самый простой выход из грязной проблемы:

> ./a.out
Enter the number of elements: 10
Fibonacci Series: 0 1 1 2 3 5 8 13 21 34 
Do you wish to continue? (Y/N): Y
Enter the number of elements: 10
Fibonacci Series: 0 1 1 2 3 5 8 13 21 34 
Do you wish to continue? (Y/N): N
>
2 голосов
/ 02 мая 2019

Ваша проблема заключается в использовании этих статических переменных.Они сохраняют свои значения даже вне области видимости, что означает, что при вызове функции n1 и n2 будут иметь свои последние назначенные значения.Я решил эту проблему, передав n1 и n2 по параметрам.Эти функции заменяют вашу печать Фибоначчи.

void printFibonacci2(int length, int n1, int n2) {
    int n3;
    if(length > 0) {
        n3 = n1 + n2;
        n1 = n2;
        n2 = n3;
        printf("%d ", n3);
        printFibonacci2(length - 1, n1, n2);
    }
}

void printFibonacci (int n)
{
  printFibonacci2(n, 0, 1);
}

Вы можете довольно хорошо кодировать, но проблема решена.

...