Рекурсивная реализация функции Фибоначчи - PullRequest
0 голосов
/ 08 ноября 2018

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

Код указан ниже:

#include <stdio.h>

int main(int fib) {
  int n,m, count=0; //'count' counts #times function is called
  printf("enter n");
  scanf("%d",&n);
  return fib_rec(n, &count);
}

int fib_rec(int n, int *count)
{
  int b=0,c=1;
  *count = *count +1;
  if(n<=1)
  { 
    return n;
  }
  else
  {
    printf (count);
    return fib_rec(n-1, *count)+ fib_rec(n-2, *count);
  }
}

Ошибки компиляции приводятся ниже при запуске на сайте reptl.it, как показано.

main.c: In function 'main':
main.c:7:10: warning: implicit declaration of function 'fib_rec' [- 
Wimplicit-function-declaration]
   return fib_rec(n, &count);
      ^~~~~~~
main.c: In function 'fib_rec':
main.c:20:13: warning: passing argument 1 of 'printf' from incompatible 
pointer type [-Wincompatible-pointer-types]
   printf (count);
         ^~~~~
In file included from main.c:1:
/usr/include/stdio.h:364:43: note: expected 'const char * restrict' but 
argument is of type 'int *'
   extern int printf (const char *__restrict __format, ...);
                ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
main.c:21:25: warning: passing argument 2 of 'fib_rec' makes pointer from 
integer without a cast [-Wint-conversion]
   return fib_rec(n-1, *count)+ fib_rec(n-2, *count);
                     ^~~~~~
main.c:10:25: note: expected 'int *' but argument is of type 'int'
   int fib_rec(int n, int *count)
                ~~~~~^~~~~
main.c:21:47: warning: passing argument 2 of 'fib_rec' makes pointer from 
integer without a cast [-Wint-conversion]
   return fib_rec(n-1, *count)+ fib_rec(n-2, *count);
                                           ^~~~~~
main.c:10:25: note: expected 'int *' but argument is of type 'int'
  int fib_rec(int n, int *count)
                ~~~~~^~~~~
enter n 10
exit status -1
>

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

в main

  1. main имеет прототип int main(void) или int main(int argc, int argc *[]). fib не является допустимым вводом для main.

  2. main обычно возвращает 0. Поэтому строку fib_rec(n, &count); следует поставить перед возвратом.

  3. переменная count не была объявлена. Переменная m не используется.

  4. Перед функцией main должно быть объявление для fib_rec. int fib_rec(int n, int *count);

В fib_rec

  1. Функция для printf неверна. - должно быть %d с *count

  2. Рекурсивный вызов неверен, поскольку count в fib_rec является указателем, его можно напрямую передать в функцию, не принимая значения. Вот так - return (fib_rec(n-1, count)+ fib_rec(n-2, count));

  3. Неиспользуемая переменная b и c

Это решает проблемы компиляции. Код ниже.

int fib_rec(int n, int *count);

int main(void) {

  int n;
  int count;
  printf("enter n"); 
  scanf("%d",&n);
  count = 0;  // counts the number of times the function is called
  fib_rec(n, &count);
  return 0;

}

int fib_rec(int n, int *count)
{
   *count = *count +1;

   if ((n<=1) )
   { 
      return 1;
   }
   else
   {
     printf ("%d ", n);
     return (fib_rec(n-1, count)+ fib_rec(n-2, count));
   }
}
0 голосов
/ 08 ноября 2018

Я вставил ваш код в https://tio.run/#c-gcc, и вот результат:

main прототип

.code.tio.c:3:7: warning: ‘main’ takes only zero or two arguments [-Wmain]
   int main(int fib) {
       ^~~~

прототипом функции main является int main(void) или int main(int argc, char *argv[])

Поскольку вы хотите, чтобы пользователь вводил число, вы можете выбрать первую форму.

count тип

.code.tio.c: In function ‘main’:
.code.tio.c:7:5: error: ‘count’ undeclared (first use in this function)
     count = 0;  // counts the number of times the function is called
     ^~~~~

Вы должны указать тип переменной count, например

int count = 0;

fib_rec декларация

.code.tio.c:8:12: warning: implicit declaration of function ‘fib_rec’ [-Wimplicit-function-declaration]
     return fib_rec(n, &count);
            ^~~~~~~

Вы не объявили функцию перед ее использованием.

Вы можете объявить это следующим образом: int fib_rec(int n, int *count) например, перед определением main.

printf использование

.code.tio.c: In function ‘fib_rec’:
.code.tio.c:21:15: warning: passing argument 1 of ‘printf’ from incompatible pointer type [-Wincompatible-pointer-types]
       printf (count);
               ^~~~~

Функция printf запрашивает некоторое форматирование. Если вы хотите отобразить целочисленное значение, используйте %d:

printf("count value is: %d\n", count);

несовместимый тип указателя

.code.tio.c:22:27: warning: passing argument 2 of ‘fib_rec’ makes pointer from integer without a cast [-Wint-conversion]
       return fib_rec(n-1, *count)+ fib_rec(n-2, *count);
                           ^~~~~~

Здесь count уже является указателем на целое число, * не требуется:

return fib_rec(n-1, count)+ fib_rec(n-2, count);

отображение вычисленного значения

Ваш код возвращает вычисленное значение, но не отображает его. Для этого замените return fib_rec(n, &count); на

printf("fib_rec(%d) = %d\n", n, fib_rec(n, &count));
return 0;

Таким образом, исправленный код может быть:

#include <stdio.h>

int fib_rec(int n, int *count);

int main(void) {
    int n;
    printf("enter n\n");
    scanf("%d",&n);
    int count = 0;  // counts the number of times the function is called
    printf("fib_rec(%d) = %d\n", n, fib_rec(n, &count));
    return 0;

}

int fib_rec(int n, int *count)
{
    int b=0,c=1;
    *count = *count +1;
    if(n<=1)
    { 
       return n;
    }
    else
    {
      printf ("count: %d\n", *count);
      return fib_rec(n-1, count)+ fib_rec(n-2, count);
    }
}
...