Игорь Игорь
Игорь Игорь

поясните пожалуйста как работает одна строчка программы на С++

программа возведения в степень числа на основе рекурсии.
программа не моя, из учебника.

#include

using namespace std;
typedef unsigned short USHORT;
typedef unsigned long ULONG;

ULONG GetPower(USHORT n, USHORT power);

int main()
{
USHORT number, power;
ULONG answer;

cout << "Enter a number:";
cin >> number;// число, например 2
cout << "Enter a power:";
cin >> power;// степень, например 4

answer = GetPower(number, power);
cout << number << "to the" << power << "the power is" << answer << endl;
return 0;
}

ULONG GetPower(USHORT n, USHORT power)
{
if (power==1)
return n;
else
return (n*GetPower(n, power-1));

}

поясните пожайлуста как работает строчка и как в результате получилось 16? //return (n*GetPower(n, power-1)); //

розпишите пожалуйста действия этой строчке с цыфрами и результатом если не трудно.

Вопрос исчерпан, благодарю Mikhail Levin.

ZV
Zabenkova Viktorya

Надо рассматривать не одну эту строчку, а всю развилку:
if (power==1) return n; //Если power ==1, то просто вернуть n: n в степени 1 равно n
else //иначе, т. е. если power>1, вариант 0 не рассматриваем
return (n*GetPower(n, power-1));//вызвать эту же функцию, но с параметром power на 1 меньше, т. е. ближе к 1, умножить результат на n и вернуть

Произойдет power-1 вложенных вызовов функции, пока в самой последней не окажется power==1; тогда пройдет возврат из самой внутренней функции с результатом n (первая ветвь) , из следующей - с результатом n*n, из следующей - n*n*n и т. д. ; самая первая функция вернет n^power, что нам и нужно.

АВ
Анастасия Владимировна

а в чем вопрос?
как положено в Си и Си++ любое выражение считается, потом его результат возвращается вызывающей программе. ТО, что она вызывает сама себя - никакой роли не играет, себя тоже можно вызывать во всех приличных языках.

При новых вызовах параметры функции - локальные переменные, от есть power в каждом вложенном вызове - свой собственный.

если вызвать
GetPower(2,4) - проверяем 4 != 1, вызываем саму себя
GetPower(2,3) - проверяем 3 != 1, вызываем саму себя
GetPower(2,2) - проверяем 2 != 1, вызываем саму себя
GetPower(2,1) - проверяем 1 == 1, возвращаем 2
оказываемся в GetPower(2,2), возвращаем 2*2=4
оказываемся в GetPower(2,3), возвращаем 2*4=8
оказываемся в GetPower(2,4), возвращаем 2*8=16

Ев
Евгений

надо понять саму суть рекурсии чтоб в дальнейшем исбавиться от головняка. Возьми лист и карандаш и попробуй в ручную сосчитать.

Кристина Кристина
Кристина Кристина

Это называется рекурсивная функция, то есть функция вызывает саму себя. Обязательно присутствует оператор if, который останавливает процесс вызова. Для примера, чтобы было понятно можно взять рекурсивное определение функции факториала n!. То есть n! = n * (n-1) * (n-2) * 1. Рекурсивно можно определить как n! = n * (n-1)! . И в программе можно точно так же рекурсивно запустить функцию, где для n=1 функция завершится, а для n>1 функция произведет рекурсивный вызов самой себя.

Похожие вопросы
[С++] Помогите одну строчку Delphi перевести в С++
Господа поясните пожалуйста!
помогите добить одну строчку пожалуйста
Подскажите, пожалуйста, как работает эта программа.
Помогите пожалуйста, программы ни одна не запускается!!!
Нужно раскодировать одну строчку...
Нужно раскодировать одну строчку
Как записать эту формулу в одну строчку в Excel?
Поясните, что к чему, что значат все строчки, только простыми словами, подробно
написать - пояснить код программы в С++