2013-02-08 4 views
-2

У нас есть треугольник из блоков. Самая верхняя строка имеет 1 блок, следующая строка вниз имеет 2 блока, следующая строка имеет 3 блока и так далее. Вычислить рекурсивно (без циклов или умножения) общее количество блоков в таком треугольнике с заданным количеством строк.Рекурсия не может принять это правильно

triangle(0) → 0 
triangle(1) → 1 
triangle(2) → 3 

Это мой код:

public int triangle(int rows) { 
    int n = 0; 

    if (rows == 0) { 
    return n; 
    } else { 
    n = n + rows; 
    triangle(rows - 1); 
    } 
} 
+1

Каков ваш конкретный вопрос? пахнет запросом кода –

ответ

2

При написании простой рекурсивной функции, она помогает разделить его на «базовый случай» (когда вы прекращаете) и в случае, когда вы рекурсия. Оба случая должны что-то вернуть, но рекурсивный случай снова вызовет функцию в какой-то момент.

public int triangle(int row) { 
    if (row == 0) { 
    return 0; 
    } else { 
    return row + triangle(row - 1); 
    } 
} 

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

2

Вы не используете возвращаемого значения вашей функции. Вместо этого вы всегда объявляете новую локальную переменную. В противном случае ваше решение довольно близко к правильному. Кроме того, вы должны добавить еще один return в случае, если вы не в строке 0.

0
public static int triangle (int rows) { 
    int n = 0; 
    if (rows == 0) { 
    return n; 
    } else { 
    n = n + rows; 
    n = n + triangle(rows - 1); 
    } 
    return n; 
} 
Смежные вопросы