Вы выделяете память для массива из 100 целых чисел с помощью int ar[100]
и вводите n
, который устанавливается с помощью scanf("%d", &n)
.Если на этом этапе вы введете число больше 100, ваша программа будет вызывать ошибку, потому что ваш цикл for (i = 0; i < n ; i++)
попытается получить доступ к ar[100]
, что является ошибкой доступа к памяти (самый высокий доступный индекс массива равен ar[100 - 1]
, обратите внимание, что 100- 1 <100).В любом случае, вы заполняете <code>n индексы ar
в цикле.ptr = &ar
просто назначает начальный адрес ar
для ptr
.Кстати ptr = ar
тоже будет работать, &
не нужен.Теперь вы можете использовать ptr
так же, как вы использовали ar
.
Самый простой способ понять рекурсию - это перейти прямо к последнему вызову maximum
.Но сначала, поймите, что вы передали ptr
в функцию, которая аналогична передаче ar
(помните, они одинаковы в main
с ptr = ar
.).
Так что впоследний вызов maximum
, когда n + 1 == 1
(аналогично n == 0
), возвращается ar[n]
, равный ar[0]
, который является первым номером, который вы ввели для 'Printing the list'
(он был сохранен в ar[0]
).
Теперь во втором последнем вызове maximum
, n + 1 == 1
ложно, потому что n = 1
, поэтому мы переходим к max = maximum(ar, n - 1)
.Это результат последнего вызова maximum
, который я только что объяснил, поэтому max
имеет значение ar[0]
.Теперь у вас есть return ar[n] > max ? ar[n] : max
, что совпадает с return ar[1] > ar[0] ? ar[1] : ar[0]
.Это то же самое, что
if (ar[1] > ar[0]) {
return ar[1];
} else {
return ar[0];
}
И вы можете видеть, что это возвращается в зависимости от того, что больше: ar[0]
или ar[1]
.Теперь для третьего последнего вызова maximum
, max
является результатом второго последнего вызова maximum
.И вы можете видеть, как картина появляется.Вы вернете в зависимости от того, что больше: max
или ar[n]
для всех остальных вызовов на maximum
, и к тому времени, как вы получите первый вызов maximum
, вы сравните все значения в ar
чтобы найти его максимум и вернуть его.
Также, как сказал Аджай, правильно, ar[n]
обращается к значению, которое вы никогда не инициализировали в цикле.Вы должны написать int max = maximum(ptr, n - 1)
в main
, чтобы исправить это.