2016-09-26 2 views
0

Я просто хотел удостовериться, что я полностью уверен в рекурсии. Я использовал его в нескольких приложениях, но понял, что, когда кто-то попросил меня определить его (более новый программист спросил об этом), я немного пошатнулся в определении и немного разобрался с ним. Я просто хотел связаться с большим сообществом разработчиков, чтобы убедиться, что я на правильном пути.Освещение рекурсии

Из того, что я знаю, рекурсия в информатике - это когда некоторые ответы на заданную проблему или проверку (то есть оператор if) зависят от чего-то другого, связанного с тем же методом. Одним из способов решения этой проблемы может быть функция, вызывающая себя (которая поддерживается большинством языков программирования). Я написал простую программу Фибоначчи ниже:

public int fib(int n) { 
    if(n <= 1) { 
     return n; 
    } else { 
     return fib(n - 1) + fib(n - 2); 
    } 
} 

Дайте мне знать, если я на правильном пути. Кроме того, я знаю, что есть похожие вопросы по рекурсии, но, пожалуйста, не закрывайте этот вопрос как дубликат, потому что это более общий вопрос, не ограничиваясь конкретным языком, а скорее понятие о том, что такое рекурсия.

Спасибо,

brld

+0

Рекурсивная функция - это функция, использующая сам. вы можете видеть глубже с рекурсией хвоста и как компилятор может переписать его как цикл. рекурсивный метод часто может быть петлями. – Tokazio

+1

Ты уже об этом думаешь. Рекурсия - это когда функция/метод вызывает себя. – Tibrogargan

+1

Пока вы не понимаете рекурсию, прочитайте это предложение с самого начала. –

ответ

2

Вы находитесь на правильном пути. Я бы разбил это на части:

  1. Определение: По определению словаря рекурсия - это процесс, называющий себя. Этот вызов обычно прямой, как в вашем примере, но также может быть косвенным: f1 и f2 называют друг друга, но не сами.
  2. Пример: Так же, как вы это сделали ... показать известную функцию с понятным рекурсивным определением. Я обычно использую факториал, поскольку он имеет только один рекурсивный вызов; то я представляю случай Фибоначчи.
  3. Механика: Опишите критические свойства базового футляра (что заставило его остановиться, наконец) и упрощение (уменьшите проблему до повторения).
  4. Правильное использование: Практически любое реальное приложение для программирования с рекурсивным описанием будет иметь итеративное (циклическое) решение, которое занимает меньше вычислительного времени. Однако, если описание natural является рекурсивным, вполне возможно, что наиболее эффективное решение в конечном итоге является рекурсивным. Рассмотрите ресурсы ремонта и обслуживания в дополнение к простым циклам выполнения и помните, что FLOPS дешевле каждый месяц.
+0

Хороший ответ, хотя я не согласен в какой-то степени с вашей точкой № 4. Вы можете внедрять нерекурсивные решения по неотрицательным рекурсивным задачам, но в некоторых случаях это требует, чтобы вы поддерживали явный стек для промежуточной информации о состоянии, которая не используется немедленно. Несколько примеров: Башни Ханоя, обход дерева, рекурсивный анализ спуска, наличие переменного числа вложенных циклов и т. Д. В этих случаях проще и с большей вероятностью давать правильные результаты, если вы рекурсивно пишете решение и позволяете языку обрабатывать стек аспекты. – pjs

+0

Вот что я сказал: «наиболее эффективное решение в конечном итоге является рекурсивным». Я отношу этот принцип к другим парадигмам. За несколько дней до генерации алгоритмов сортировки я часто кодировал сортировку N^2, потому что знал, что будущие инженеры могут ее легко понять. – Prune

+0

Я понимаю и согласен с той частью того, что вы написали. Я думаю, что здесь звучит как сломанная запись, но я пытался указать другим респондентам, что ошибочно бросать рекурсию как * просто * вариант цикла. – pjs

Смежные вопросы