2013-05-25 3 views
-7

Я пытаюсь изучить recusrion из книги, но есть кое-что, что не объясняется достаточно ясно для меня.Obfuscated C recursion Код Пожалуйста, объясните

Следующий код

int f(int n, int x, int y) 
{ 
if(n==0) return x+y; 
if(y==0) retun x; 
return f(n-1,f(n,x,y-1),f(n,x,y-1)+y); 
} 

, что произойдет, если я называю F (1,2,2);

любая помощь с объяснить и благодаря

+6

Используйте отладчик и, несмотря на это, делайте заметки на стеке вызовов на бумаге. –

+0

синтаксическая ошибка строка 4 'retun' – user1937198

+1

Или, скорее, добавить заявления печати и проанализировать трассировку. – zch

ответ

1

и делает теоретически возможный в бумагу:

е (1,2,2) -> возврат е (1-1, е (1,2,2-1), ф (1,2,2 -1) +2) Затем мы делаем внутреннее значение

Оба являются одинаковыми f (1,2,2-1) -> return f (0, f (1,2,1-1), f (1 , 2,1-1) +1) снова внутренний

Снова оба одинаковые -> возврат 2 (x = 2); поэтому мы возвращаемся

return f (0, f (1,2,1-1) -> 2, f (1,2,1-1) -> 2 + 1) -> f (0, 2 , 3) -> return 2 + 3 (x + y);

Снова назад f (0, f (1,2,2-1) -> 5, f (1,2,2-1) -> 5 + 2) -> return 5 + 7 (x + y) -> Ответ 12;

4
int f(int n, int x, int y) 
{ 
    int result; 

    if(n==0) { 
    printf("f(%d, %d, %d) -> %d\n", n, x, y, x+y); 
    return x+y; 
    } 
    if(y==0) { 
    printf("f(%d, %d, %d) -> %d\n", n, x, y, x); 
    return x; 
    } 

    printf("recursing for f(%d, %d, %d)...\n", n, x, y); 
    result = f(n-1,f(n,x,y-1),f(n,x,y-1)+y); 
    printf("f(%d, %d, %d) -> %d\n", n, x, y, result); 
    return result; 
} 

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

+0

-1 без комментариев, говоря, что он делает. – Bull

+3

@ user2151446 Ты прав, я не дал ему рыбу. Вместо этого я показал ему, как ловить рыбу. – mah

1

При каждом вызове n уменьшается. Поэтому, если n положительно при первом вызове, функция будет вызываться снова n раз внутренне, а затем выйти.

В целом функция выполняет арифметические операции над x и y конечным числом раз.

Если вы пытаетесь изучить рекурсию, factorial() проще понять, насколько полезной может быть рекурсия.

int factorial(int number) 
{ 
    int temp; 

    if(number <= 1) return 1; 

    temp = number * factorial(number - 1); 
    return temp; 
} 

Вызов трассировки

факториала (3) = 3 * факториала (2)
= 3 * (2 * факториала (1))
= 3 * (2 * (1 * факториала (0)))
= 3 * (2 * (1 * 1)))
= 6

Простой обзор рекурсии:

«Как простое правило рекурсии, любая функция может быть вычислена с использованием рекурсивной подпрограммы, если: 1. Функция может быть выражена в ее собственной форме. 2. Существует этап завершения, точка, в которой f (x) известно для конкретного «x».

Поэтому, чтобы написать рекурсивную программу для факториала любого числа, мы должны выразить факториальную функцию в рекурсивной форме, используя приведенные выше правила 2: 1. fact (n) = fact (n-1) * n (рекурсивное определение факториала). 2. если n = 1, возврат 1 (этап завершения) "

+0

Возможно, они не используют факториал в качестве примера, потому что рекурсия - это ужасный способ его вычисления. В качестве примера я также видел треугольник с паскалями, что еще хуже. Однако +1 для хорошего объяснения. – Bull

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