Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Визуализация рекурсии


Автор: Mastodont 28.3.2010, 13:08
У Дейтлов есть задача
http://xmages.net/view-image.htm

Кода на рисунке 3.14 такой:
Код

//Рис. 3.15: fig03_15.cpp
//Рекурсивная функция вычисления числа Фибоначчи
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<windows>

unsigned long fibonacci(unsigned long);

int main()
{
   unsigned long result, number;

   cout << "Vvedite celoe chislo: ";
   cin >> number;
   result = fibonacci(number);
   cout << "Chislo Fibonachchi(" << number << ") = " << result << endl;

   system("pause");
   return 0;
}

//Рекурсивная описание функции fibonacci
unsigned long fibonacci(unsigned long n)
{
   if (n == 0 || n == 1) //общий случай
      return n;
   else //рекурсивный случай
      return fibonacci(n - 1) + fibonacci(n - 2);
}


Что здесь понимается под "локальной переменной"? n?

Параметр рекурсивного вызова - это, я так понимаю, то, что в скобках функции fibonacci()?

Автор: ИванМ 28.3.2010, 15:03
Цитата(Mastodont @  28.3.2010,  13:08 Найти цитируемый пост)
Что здесь понимается под "локальной переменной"? n?
Параметр рекурсивного вызова - это, я так понимаю, то, что в скобках функции fibonacci()? 

все правильно

Автор: Mastodont 30.3.2010, 15:07
Написал так:
Код

//Рис. 3.15: fig03_15.cpp
//Рекурсивная функция вычисления числа Фибоначчи
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<windows>

unsigned long fibonacci(unsigned long);

int main()
{
   unsigned long result, number;

   cout << "Vvedite celoe chislo: ";
   cin >> number;
   result = fibonacci(number);
   cout << "Chislo Fibonachchi(" << number << ") = " << result << endl;

   system("pause");
   return 0;
}

//Рекурсивная описание функции fibonacci
unsigned long fibonacci(unsigned long n)
{
   int otstup = 0; //величина отступа строки от левого края экрана

   if (n == 0 || n == 1) //общий случай
      return n;
   else //рекурсивный случай
   {
      //печатаем отступ перед выводом n
      for (int i = 1; i <= otstup; i++)
      {
         cout << " ";
      }

      cout << "n: " << n << endl;

      //печатаем отступ перед выводом (n - 1) + (n - 2)
      for (int i = 1; i <= otstup; i++)
      {
         cout << " ";
      }

      ++otstup;

      cout << "(n - 1) + (n - 2) = " << n - 1 << " + " << n - 2 << endl;

      return fibonacci(n - 1) + fibonacci(n - 2);
   }
}


Только отступ сделать не смог. Я понимаю, что переменная otstup не меняется, потому что каждый раз при вызове fibonacci() ставится в "0". Но как сделать так, чтобы она менялась?

Автор: ИванМ 30.3.2010, 16:25
Цитата(Mastodont @  30.3.2010,  15:07 Найти цитируемый пост)
Но как сделать так, чтобы она менялась?

передавать ее параметром функции fibonacci или делать глобальной/статической, если всегда она при последующем вызове будет увеличиваться. в любом случае первый вариант лучше

Автор: Mastodont 4.4.2010, 12:27
Сделал отступ статической.

Цитата
передавать ее параметром функции fibonacci

в качестве аргумента функции что ли? Несовсем понял. Напиши подробнее.

Автор: ИванМ 4.4.2010, 14:31
Цитата(Mastodont @  4.4.2010,  12:27 Найти цитируемый пост)
в качестве аргумента функции что ли

да

Автор: Mastodont 5.4.2010, 17:45
Понятно. Попробую.

Автор: ИванМ 5.4.2010, 17:53
Mastodont, по идеи конечно так делать неграмотно. Грамотно отдельную функцию написать, которая будет вызывать fibonacci и выводить инфу. Ей уже и передавать этот аргумент.

Автор: Mastodont 8.4.2010, 20:33
Цитата
Грамотно отдельную функцию написать, которая будет вызывать fibonacci и выводить инфу. Ей уже и передавать этот аргумент.

Спасибо =) Сейчас подумаю, как сделать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)