Wpierw przetłumaczę tę funkcję na zdania:
Jeżeli wykładnik wynosi zero, to zwróć rezultat 1, bo każda liczba podniesiona do zerowej potegi to zero.
Jeżeli wykładnik większy od 0, to policz potegę o wykladniku o jeden mniejszym (w - 1) i pomnóż ją przez podstawę(p) i ten wynik zwróć jako rezultat, bo p^(w-1) * p = p^w
W sensie skąd kompilator wie, że chcemy podstawić za potęgę zmienną p, a nie w?
czyli masz problem z linijką return p * potega( p, w - 1 )? Funkcja nie zwraca jednego ze swoich argumentów, wynikiem działania funkcji nie jest ani p, ani w, tylko to co stoi po slowie kluczowym return. Tutaj po słowie kluczowym return stoi podstawa * potega o wykladniku o jeden mniejszym i to zostanie zwrocone, ani p, ani w, tylko wynik potegowania