2015-02-12 7 views
2

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

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

public static int[] pascalLine(int order){ 
    // ska räkna ut n:te linjen i pascals triangel 
    int [] arr = new int[order]; 
    if (order < 0){ 
     throw new IllegalArgumentException("Value must be greater than 0"); 
    } 
    else if(order == 1){ 
     return new int [] {1}; 
    } 
    arr[0] = arr[order-1] = 1; 
    int [] arrRev = pascalLine(order-1); 
    System.out.println(toString(arrRev)); 
    for (int i = 1; i<arrRev.length; i++){ 
     arr[i] = arrRev[i-1] + arrRev[i]; 
    } 
    return arr; 
} 

Я получаю весь треугольник, напечатанный до строки 5. Я не понимаю, как это возможно. Мой мыслительный процесс заключался в том, что метод будет называть себя до тех пор, пока он не достигнет 0 и не даст исключение.

Но, возможно, первое вызов метода (в основном) по-прежнему продолжается, а другой запускается (при вызове внутри метода), и это продолжается до 1 (все еще не понимает, почему это не делает) t достигает нуля, хотя).

+0

Примечание: проверьте «заказ» перед тем, как использовать его, а также проверьте, если он равен * нулю. – RealSkeptic

+0

Просто комментарий, вы должны проверить 'order', прежде чем создавать' int [] arr' с размером 'order', вы можете получить' NegativeArraySizeException'. –

ответ

3

Это вызвало бы только исключение, если начальный вызов pascalLine имел отрицательный order.

else if(order == 1){ 
    return new int [] {1}; 
} 

Рекурсия завершается, когда order == 1, так что если вы начинаете с положительным order, вы никогда не может достичь отрицательного order.

pascalLine(order-1) вызывается только если order > 1.

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