2016-02-29 5 views
-1

Я боролся с этим часами.Понижение значения не работает в цикле while

У меня есть рекурсивная функция, как описано ниже:

void fractal (turtle_t *t, int x){ 
    while (x != 0){ 
    printf("%d\n", x); 
    turtle_walk (t, 20*x); 
    turtle_turn (t, 25); 
    x -= 2; 
    fractal (t, x); 
    } 
} 

Когда я запускаю этот код, кажется, что все работает, кроме x -= 2. Я начинаю со значения 10 для параметра x. Заявления на печать дают мне:

10, 8, 6, 4, 2, 2, 6, 4, 2, 2, etc 

Я что-то упустил?

Я также попытался с помощью

fractal (t, x-2); 

для рекурсивного вызова, но это не будет работать.

+1

Compile со всеми предупреждениями и отладочной информации ('НКУ -Wall -Wextra -g'). Затем ** используйте отладчик ** ('gdb') для запуска вашей программы шаг за шагом, запрашивайте значения переменных и понимайте, что происходит –

+0

цикл while управляет рекурсией. – Scholarmate

+0

Возможно, вы хотите 'if' вместо' while'? Кстати, каков ожидаемый результат? –

ответ

0

Попробуйте

void fractal (turtle_t *t, int x){ 
    if(x >= 0){ 
    printf("%d\n", x); 
    turtle_walk (t, 20*x); 
    turtle_turn (t, 25); 
    x -= 2; 
    fractal (t, x); 
} 

} 
+0

это исправляет, но цикл while должен работать. – Scholarmate

+0

Во время попытки x> 0 – Grv

+2

'else return' избыточен; достижение конца функции void возвращается в любом случае –

1

Когда я запускаю этот код, все, кажется, работает execpt х - = 2.

x -=2 работает должным образом, что, почему вы получаете правильный printf, когда вы вошли 10.

Посмотрите на эту while (x != 0). если x идет отрицательно, это вызовет бесконечный цикл. , поэтому измените условие цикла на while (x >= 0).

2

Давайте попробуем увидеть этот код на примере.

void fractal (turtle_t *t, int x){ 
    while (x != 0){ 
    printf("%d\n", x); 
    turtle_walk (t, 20*x); 
    turtle_turn (t, 25); 
    x -= 2; 
    fractal (t, x); 
    } 
} 

Допустим, эта функция была вызвана с помощью

fractal(pTurtle, 4); 

Назовём это первый кадр стека, и как это будет выглядеть это:

x = 4 
enter the while loop since 4 != 0 
print out 4 
ignoring turtle_walk and turtle_turn for now 
x is now 2 
call the fractal function with pTurtle and 2 
remember later we are not done with this function 

Теперь было бы создать второй стек кадра, который выглядит как вызов функции фрактала (pTurtle, 2)

x = 2 
enter the while loop since 2 != 0 
print out 2 
ignoring turtle_walk and turtle_turn for now 
x is now 0 
call the fractal function with pTurtle and 0 

И он будет генерировать третий кадр стека, так что будет вызов фрактала как

fractal(pTurtle, 0) 

Что бы ничего не делать. Но мы еще не закончили. Теперь мы вернулись во второй стек кадров, который называется функцией, которая называется фрактал (pTurtle, 0), которая теперь имеет x = 0. Таким образом, это не будет выполнено и будет выполнено.

Теперь мы возвращаемся обратно к самой первой кадре стека, которая по-прежнему имеет x = 2. Таким образом, он будет снова смотреть и печатать 2 и делать то же самое, что и второй стек стека.

Так выход вы, вероятно, получите от вашей программы с отпечатками является:

4 
2 
2 
+0

ОК, как это исправить? – Scholarmate

+1

Нет необходимости исправлять то, что не сломано. Функция «фрактал» печатает фрактальный каракули. Уорден дал вам объяснение, как работает цикл dn рекурсии. (Если у вас нет четкого представления о том, что функция должна достичь, но это не так, но мое впечатление состоит в том, что 'fractal' не является функцией, которую вы написали сами.) –

+0

fractal - это то, что я написал себя. Я, очевидно, новичок в рекурсии и пытаюсь понять все это. Я объяснил, что, как я думаю, должно произойти, и я все еще не понимаю, почему то, что я думаю, должно произойти, не происходит. – Scholarmate

3

Вы должны добавить операторы печати на входе и выходе в функцию, так что вы можете увидеть, где код идет. Это is работает как закодированный - printf() в функции не выполняется, когда x == 0, конечно.

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

#include <stdio.h> 

static 
void fractal(/*turtle_t *t,*/ int x) 
{ 
    int x0 = x; 
    printf("-->> %d\n", x0); 
    while (x != 0) 
    { 
     printf("%d\n", x); 
     /* 
     turtle_walk (t, 20*x); 
     turtle_turn (t, 25); 
     */ 
     x -= 2; 
     fractal(/*t,*/ x); 
    } 
    printf("<<-- %d\n", x0); 
} 

int main(void) 
{ 
    fractal(10); 
    return 0; 
} 

И вот результат:

-->> 10 
10 
-->> 8 
8 
-->> 6 
6 
-->> 4 
4 
-->> 2 
2 
-->> 0 
<<-- 0 
<<-- 2 
2 
-->> 0 
<<-- 0 
<<-- 4 
4 
-->> 2 
2 
-->> 0 
<<-- 0 
<<-- 2 
2 
-->> 0 
<<-- 0 
<<-- 6 
6 
-->> 4 
4 
-->> 2 
2 
-->> 0 
<<-- 0 
<<-- 2 
2 
-->> 0 
<<-- 0 
<<-- 4 
4 
-->> 2 
2 
-->> 0 
<<-- 0 
<<-- 2 
2 
-->> 0 
<<-- 0 
<<-- 8 
8 
-->> 6 
6 
-->> 4 
4 
-->> 2 
2 
-->> 0 
<<-- 0 
<<-- 2 
2 
-->> 0 
<<-- 0 
<<-- 4 
4 
-->> 2 
2 
-->> 0 
<<-- 0 
<<-- 2 
2 
-->> 0 
<<-- 0 
<<-- 6 
6 
-->> 4 
4 
-->> 2 
2 
-->> 0 
<<-- 0 
<<-- 2 
2 
-->> 0 
<<-- 0 
<<-- 4 
4 
-->> 2 
2 
-->> 0 
<<-- 0 
<<-- 2 
2 
-->> 0 
<<-- 0 
<<-- 10 
Смежные вопросы