как ответить на этот вопрос рекурсии и есть ли большая разница между ним и циклом - PullRequest
0 голосов
/ 17 января 2019

Какая последовательность чисел будет напечатана следующей рекурсивной Процедура, если мы начали его с N присвоили значение 1?

       procedure Exercise (N)
        print the value of N;
           if (N < 3) then (apply the procedure Exercise to the
          value N + 1);
        print the value of N.

правильный ответ, предположительно, 123321, но я попытался ответить на него сам, и я получил 1233

Ответы [ 3 ]

0 голосов
/ 17 января 2019

для N = 1

print 1;
if(N<3) --> Exercise (1+1);  //the condition is TRUE here. So the function will be called again for N=2
print 1;

для N = 2

print 2;
if(N<3) --> Exercise (2+1); // Condition is again TRUE. So the function is called for N=3 
print 2;

для N = 3

print 3;
if(N<3) --> Exercise (3+1); // Condition is FALSE here. So the function won't be called
print 3;

Структура будет похожа,

print 1;
  print 2;
    print 3;
    print 3;
  print 2;
print 1;
0 голосов
/ 17 января 2019

Когда я хочу знать, что делает алгоритм, я часто кодирую и выполняю его. Вставка операторов print для отслеживания выполнения и потока данных помогает показать иерархию вызовов.

indent = ""

def exercise(n):
    global indent
    indent += "  "
    print(indent, "ENTER", n)

    # Original assignment, with assigned output not indented
    print("REAL", n)
    if n < 3:
        exercise(n+1)
    print("REAL", n)

    print(indent, "LEAVE", n)
    indent = indent[2:]

exercise(1)

Вывод: здесь трассировка выполнения с выводом присваивания, помеченным как «REAL». Функции входа и выхода являются торговыми и с отступом.

   ENTER 1
REAL 1
     ENTER 2
REAL 2
       ENTER 3
REAL 3
REAL 3
       LEAVE 3
REAL 2
     LEAVE 2
REAL 1
   LEAVE 1

Да, это легко сделать с помощью пары петель. Является ли это «большой разницей», зависит от вашей оценочной функции. Например:

for i in range(1, n+1):
    print(n)
for i in range(n, 0, -1):
    print(n)

Если ваша обработка отдельного случая тривиальна (например, print(n)), то это легко. Когда ваша итерация от одного элемента к следующему тривиальна (например, n+1), тогда это легко. Однако, когда любой из них сложный, рекурсия часто является более подходящим способом описания и реализации процесса.

0 голосов
/ 17 января 2019

Вы забыли последнее " выведите значение оператора N .

Скажем, мы вызываем это с Exercise(1). Тогда это означает, что оно оценивается как:

Exercise(1):
    print 1
    Exercise(1+1)
    print 1

вызов Exercise(2), приведет к:

Exercise(2):
    print 2
    Exercise(2+1)
    print 2

вызов Exercise(3) приводит только к двум операторам print, поскольку условие в операторе if ложно, следовательно:

Exercise(3):
    print 3
    print 3

Если мы сейчас выполним подстановку, мы получим:

Exercise(1):
    print 1
        print 2
            print 3
            print 3
        print 2
    print 1

, который действительно даст ожидаемую последовательность.

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