2014-10-31 2 views
10

В чем разница между возвратом и рекурсией? Как работает эта программа?Разница между обратным отсчетом и рекурсией?

void generate_all(int n) 
{ 
    if(n<1) printf("%s\n", ar); 
    else{ 
      ar[n-1]='0';  //fix (n)th bit as '0' 
      generate_all(n-1); //generate all combinations for other n-1 positions. 
      ar[n-1]='1';  //fix (n)th bit as '1' 
      generate_all(n-1); //generate all combinations for other n-1 positions. 
    } 
+1

Думаю, вам лучше сделать ваш вопрос более понятным. 'ar' даже не определен в коде, который вы поставляете. – Ashe

+0

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

ответ

8

Рекурсия описывает призвание той же функции, что вы находитесь. Типичный пример рекурсивной функции факториала, то есть что-то вроде

int fact(int n) { 
    int result; 
    if(n==1) return 1; 
    result = fact(n-1) * n; 
    return result; 
} 

То, что вы видите здесь тот факт, называет себя. Это то, что называется рекурсией. Вам всегда нужно условие, которое останавливает рекурсию. Здесь он if(n==1) в сочетании с тем, что п всегда будет уменьшаться каждый раз, когда она вызывается (fact(n-1))

возвратом алгоритм, который пытается найти решение заданных параметров. Он создает кандидатов для решения и оставляет те, которые не могут выполнить условия. Типичным примером для решения задачи будет Eight Queens Puzzle. Backtracking также широко используется в Neuronal Networks.

В приведенной ниже программе используется рекурсия. Подобно факториальной функции, он уменьшает аргумент на 1 и заканчивается, если n < 1 (потому что тогда он будет печатать ar вместо остальных).

15

Этот вопрос походит на вопрос, в чем разница между автомобилем и DeLorean.

Функция рекурсии вызывает себя до достижения базового футляра.

В обратном направлении вы используете рекурсию, чтобы исследовать все возможности, пока не получите лучший результат для проблемы.

Может быть немного трудно понять, я прилагаю текст из here:

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

Предположим, вы попали на плохую страницу. Вы можете вернуться назад, чтобы продолжить поиск хорошего листа, отменив свой последний выбор и попробовав следующий вариант в этом наборе параметров. Если у вас заканчиваются варианты, отменить выбор e, что привело вас сюда, и попробуйте другой выбор на этом узле. Если вы в конечном итоге в корне с не осталось вариантов, нет хороших листьев можно найти.»

Это должно пример.

enter image description here

Ваш кусок кода просто рекурсии, как вы никогда не возвращайся, если результат не соответствует вашей цели.

1

В моем понимании, обратное отслеживание - это алгоритм, как и все другие алгоритмы, такие как BFS и DFS, но рекурсия, а также итерация - это методы, они находятся на более высоком уровне чем алгоритмы, например, для реализации DFS, вы можете использовать рекурсию, которая довольно интуитивно понятна но вы также можете использовать итерацию со стеком, или вы также можете думать, что рекурсия и итерация - это просто методы поддержки ваших алгоритмов.

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