Итак, я смотрю на метод рекурсии, который использую для решения задачи кода. Я считаю, что это может быть просто недоразумением с моей стороны. Вот рекурсивная функция.
public static boolean canSum(int[] arr, int max)
{
System.out.println(Arrays.toString(arr));
if(max == 0) return true;
if(arr.length == 0) return false;
else return canSum(Arrays.copyOfRange(arr, 1, arr.length), max) | canSum(Arrays.copyOfRange(arr, 1, arr.length), max-arr[0]);
}
Теперь она работает так, что в конечном итоге она выдаст мне true или false, если целые числа в моем массиве в любой комбинации дадут мне максимальное значение, которое я ищу, или он вернет ложь. Чего я не понимаю, так это того, что если я System.out.println(Arrays.toString(arr)
вижу, что мой массив уменьшается до 0, то, если я отлаживаю, он попадает в строку if(arr.length == 0) return false;
. Так почему же функция не прерывается и возвращает false. Эта рекурсивная функция продолжает работать по существу. Вот консольные массивы, которые я вижу для этого варианта использования Я не понимаю оператора | (Я думаю, что || работает также) и почему мне нужно max=arr[0]
. Основываясь на отладке, похоже, что canSum(Arrays.copyOfRange(arr, 1, arr.length), max-arr[0])
запускается, когда моя arr.length = 0. Так действительно ли OR здесь как троичное здесь для рекурсивного вызова функции? Я не уверен, как 'вернуть recurseFunct (n-1, m) | recurseFunct (n-1, mn [0]) 'точно работает в этом сценарии. Это кажется очень удобным, и я хотел бы понять это лучше.
****** Добавление этого видео, поскольку оно поддерживает принятый ответ *******
Вы можете визуально увидеть стек, который используется в этом рекурсе, слева сторона отладчика. Размер стека немного меняется, пока он окончательно не опустошится полностью. После опустошения я верну true или false в рекурсивной функции в этой точке. Это был хороший опыт для меня. Спасибо!