2015-11-02 3 views
-3

Может ли кто-нибудь объяснить мне, что происходит в этом случае? Из небольшого знания, которое у меня есть (и, очевидно, я ошибаюсь в своих мыслях), мне следует продолжать уменьшать x на 1 до тех пор, пока x равно 3. Затем он должен перейти к «return true, part и как функция возвращает true» возвращается во второй оператор if, возвращает false, а затем выходит из функции, так как нечего делать, если функция возвращает false. Но это продолжает возвращаться ко второму оператору if, добавляя 1 к x, пока не снова 9, а затем выйдет. Заранее спасибо.bool возвращающая рекурсивная функция неожиданно изменяет переменную

bool Rec(int x) 
    { 
     if(x > 3) 
     { 
      if(Rec(x - 1) == true) 
      { 
       return false; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return true; 
     } 

    } 
    void main() 
    { 
     Rec(9); 
    } 
+0

Ваше первое предложение может быть заменено на 'return false;' ?? –

+0

@ πάνταῥεῖ: или все тело функции с возвратом x <= 3; ' – Olaf

+0

Что вы хотите достичь? Что значит «изменяет переменную ...»? Рекурсия здесь бесполезна. – Olaf

ответ

0

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

Это может быть упрощена и эквивалентно:

#include <stdio.h> 

bool Rec(int x) 
{ 
    printf("x = %d\n", x); 

    if (x > 3) 
    { 
     Rec(x - 1); 
     return false; 
    } 

    return true; 
} 

int main(int argc, char* argv[]) 
{ 
    Rec(9); 
    return 0; 
} 

Который производит:

x=9 
x=8 
x=7 
x=6 
x=5 
x=4 
x=3 

Однако вы также сказал: «Но это продолжает возвращаться к второй, если оператор добавления 1 до x, пока он не станет снова 9, а затем выйдет из «. Но вы на самом деле не добавляете 1 к x. Я думаю, что происходит с вашей отладкой. Вы не отложили отладки в своем коде, чтобы распечатать указанное поведение.

Поэтому я попытаюсь сделать это за вас.

bool Rec(int x) 
{ 
    printf("x = %d\n", x); 

    if (x > 3) 
    { 
     Rec(x - 1); 
     printf("*x = %d\n", x); 

     return false; 
    } 

    return true; 
} 

Который производит:

x = 9 
x = 8 
x = 7 
x = 6 
x = 5 
x = 4 
x = 3 
*x = 4 
*x = 5 
*x = 6 
*x = 7 
*x = 8 
*x = 9 

Подумайте об этом тщательно. Вы не добавляете 1. Ваша функция снова вызывает себя при печати x =, а затем, если она больше 3, сделайте то же самое. Только когда x> 3 вернется. После того, как он вернется, он снова распечатает * x = Так что это на самом деле печать, что было до рекурсивного вызова. Надеюсь, это поможет вам понять, что происходит.

Ваша функция в порядке, чтобы увидеть, как работает рекурсия. Но на практике вы никогда не будете писать такой код. Потому что вы могли бы просто написать его как простой цикл.

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

Здесь есть несколько ответов на этот вопрос, в которых приводятся примеры реального мира, где рекурсия имеет смысл. Real-world examples of recursion

+0

Отлично, это то, чем я был. Хорошо сделано для понимания моего плохо сформулированного вопроса и большое спасибо! – CoconutDug

-1

Это характер рекурсии. Вы вызвали функцию 6 раз, она будет возвращаться 6 раз.

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