Форум программистов, компьютерный форум CyberForum.ru

Рекурсивная функция возведения в степень - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.78
OasisKharkov
1 / 1 / 0
Регистрация: 28.07.2012
Сообщений: 35
21.11.2012, 20:16     Рекурсивная функция возведения в степень #1
Ребята, написал функцию для возведения в степень из учебника, но она почему-то не хочет работать.
Вот код:
C++
1
2
3
4
5
int pow(int base, unsigned short exp){
    if (exp==1)
        return base;
    else
        return (base*pow(base,exp-1));
Среда подчеркивает название функции pow и выдает такую ошибку: "more than one instance of overloaded funciton "pow" matches the argument list".
Не могу понять перевода этой фразы. Типа больше одного экземпляра перегруженной функции соответствует списку аргументов???

Чуть подправил код:
C++
1
2
3
4
5
6
7
8
int pow(int base, unsigned short exp){
    if (exp==1)
        return base;
    else{
        exp--;
        return (base*pow(base,exp));
    }
}
Ошибку среда перестала выдавать, программа заработала, но неужели в учебнике ошибка в коде, я кажись видел такой же пример с факториалом, в стиле:
C++
1
result = factor(n-1) *n
то есть в месте вызова функции, в скобках где идет перечисление аргументов, из одного из них вычитается единица.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5623 / 3102 / 351
Регистрация: 29.11.2010
Сообщений: 8,329
21.11.2012, 20:18     Рекурсивная функция возведения в степень #2
Назови функцию по другому, например myPow
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12269 / 6956 / 782
Регистрация: 27.09.2012
Сообщений: 17,255
Записей в блоге: 2
Завершенные тесты: 1
21.11.2012, 20:20     Рекурсивная функция возведения в степень #3
Цитата Сообщение от OasisKharkov Посмотреть сообщение
но неужели в учебнике ошибка в коде
ничего удивительного.
OasisKharkov
1 / 1 / 0
Регистрация: 28.07.2012
Сообщений: 35
21.11.2012, 20:36  [ТС]     Рекурсивная функция возведения в степень #4
Заметил такую фишку, если сделать аргументы одного типа, то все работает, независимо от типа возвращаемого значения:
C++
1
2
3
4
5
6
7
short pow(unsigned base, unsigned exp){
    if (exp==1)
        return base;
    else{
        return (base*pow(base,exp-1));
    }
}
Т.е. получается в рекурсивной функции параметры могут быть только одного типа?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5623 / 3102 / 351
Регистрация: 29.11.2010
Сообщений: 8,329
21.11.2012, 20:39     Рекурсивная функция возведения в степень #5
Цитата Сообщение от OasisKharkov Посмотреть сообщение
Заметил такую фишку, если сделать аргументы одного типа, то все работает, независимо от типа возвращаемого значения:
C++
1
2
3
4
5
6
7
short pow(unsigned base, unsigned exp){
    if (exp==1)
        return base;
    else{
        return (base*pow(base,exp-1));
    }
}
Т.е. получается в рекурсивной функции параметры могут быть только одного типа?
Получается, вы перегружаете стандартную функцию, а не реализуете свою. Назовите функцию по-другому, еще раз говорю.
OasisKharkov
1 / 1 / 0
Регистрация: 28.07.2012
Сообщений: 35
21.11.2012, 21:36  [ТС]     Рекурсивная функция возведения в степень #6
Спасибо MrGluck, ведь в любом учебнике написано, не называйте пользовательские функции именами стандартных функций или другими ключевыми словами. Я, по глупости, забыл, что pow(double x, double y) - стандартная и по привычке назвал мою функцию так же...
Теперь заработало:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
 
unsigned power(unsigned base, unsigned short exp);
 
int main()
{
    unsigned base, value;
    unsigned short exp;
    
    cout << "Enter base: ";
    cin >> base;
    cout << "Enter exponent: ";
    cin >> exp;
    if (!exp)
        cout << "Value is: " << 1 << "\n";
    else{
        value = power(base,exp);
        cout << "Value is: " << value << "\n";
    }
 
    return 0;
}
 
unsigned power(unsigned base, unsigned short exp){
    if (exp==1)
        return base;
    else{
        return (base*power(base,exp-1));
    }
}
Добавлено через 22 минуты
Странно только то, почему функция pow() работала, если я не подключал заголовок #include <cmath> ?
Или в современных компиляторах достаточно подключить заголовок #include <iostream>, хотя ведь он связан с вводом-выводом, а не с математическими функциями.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12269 / 6956 / 782
Регистрация: 27.09.2012
Сообщений: 17,255
Записей в блоге: 2
Завершенные тесты: 1
21.11.2012, 21:40     Рекурсивная функция возведения в степень #7
Цитата Сообщение от OasisKharkov Посмотреть сообщение
Или в современных компиляторах достаточно подключить заголовок #include <iostream>, хотя ведь он связан с вводом-выводом, а не с математическими функциями.
нигде не указано, какие он может включать файлы, а какие нет.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5623 / 3102 / 351
Регистрация: 29.11.2010
Сообщений: 8,329
21.11.2012, 21:47     Рекурсивная функция возведения в степень #8
Да и помогло вам также скидывание всех функций в кучу
C++
1
using namespace std;
Croessmah
21.11.2012, 21:49
  #9

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
Да и помогло вам также скидывание всех функций в кучу
Вот он и пример конфликта, а то кто-то спрашивал на форуме пример.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2012, 21:50     Рекурсивная функция возведения в степень
Еще ссылки по теме:

Рекурсивная функция. Возвести число в степень путём многократного умножения самого на себя C++
C++ Функция возведения в степень.
Перегрузить функцию возведения в степень C++
Рекурсивная функция возведения в степень C++
C++ Класс возведения в степень

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5623 / 3102 / 351
Регистрация: 29.11.2010
Сообщений: 8,329
21.11.2012, 21:50     Рекурсивная функция возведения в степень #10
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


Вот он и пример конфликта, а то кто-то спрашивал на форуме пример.

Не по теме:

Да я сам ссылочку для аргумента сохранил

Yandex
Объявления
21.11.2012, 21:50     Рекурсивная функция возведения в степень
Ответ Создать тему
Опции темы

Текущее время: 14:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru