Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
1

Рекурсивная функция

08.05.2013, 22:48. Показов 1457. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Походу что-то с массивами не то, когда ввожу слишком большое число (15+), то выбивает ошибку с кучами\стеками, которую я не понимаю.
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
32
33
using namespace std;
void rekursija(long long factorials[], int ArSize);
int main()
{
    cout << "Pls enter the number: " << endl;
    int ArSize;
    cin >> ArSize;
    long long * factorials = new long long[ArSize];
    
    rekursija(factorials, ArSize);
 
    system ("pause");
    return 0; 
}
 
void rekursija(long long factorials[], int ArSize)
    {
    factorials[1] = factorials[0] = 1;
    for (int i = 2; i < ArSize; i++)
    {
        factorials[i] = i * factorials[i-1];
    };
    for (int i = 0; i < ArSize; i++)
        std::cout << i << "! = " << factorials[i] << std::endl;
 
    cin >> ArSize;
    delete []factorials;
        if(ArSize != 0)
        {
        rekursija(factorials, ArSize);
        };
 
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2013, 22:48
Ответы с готовыми решениями:

Рекурсивная функция
Как написать рекурсивную функцию для реализации рекуррентной последовательности? В основной...

Рекурсивная функция
С помощью рекурсии выполнить следующее задание: Рассчитать число рыбок - самок, выращенных в...

Рекурсивная функция
Скласти програму з використанням рекурсивної функції, в якій обчислити суму 12 членів рекурентної...

Рекурсивная функция
Нужно написать рекурсивнюю функцию сложения двух чисел, используя только прибавление единицы.

15
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
08.05.2013, 23:43 2
ошибку приведи
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
08.05.2013, 23:47 3
А sizeof( long long ) у тебя чему равен?
1
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 00:34  [ТС] 4
Рекурсивная функция


Добавлено через 30 минут
Еще такая ошибка иногда, в прошлый раз было похожее когда я массив new не удалял в цикле вроде.
cout << sizeof( long long ) равен 8, но поидее же при переполнении он должен по кругу крутится не?
Рекурсивная функция
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.05.2013, 00:37 5
А. Ну так попробуй размер стека увеличить! Возможно для рекурсии его не хватает. Как это делается в MSVS я, увы, не знаю..
1
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 01:01  [ТС] 6
Еще заметил что ошибка выскакивает после ввода 2-3-го значения.

Добавлено через 16 минут
Никто не подскажет как увеличить стек в VS2010, русская версия. Я никак не могу найти.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.05.2013, 01:06 7
Нашел. Параметр "/F размер_стека".
Свойства проекта -> С/С++ -> Командная строка -> Дополнительные параметры
(переведено с английского, может быть немного не так)

http://msdn.microsoft.com/en-u... s.71).aspx
1
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 01:28  [ТС] 8
Я так понял вот тут надо было изменения сделать. Но тогда при построении ошибка
1>cl : командная строка error D8021: недопустимый числовой аргумент "/F[500000]number"
Рекурсивная функция
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.05.2013, 01:33 9
Нет, ты не так пишешь. Надо: /F[пробел]размер_стека --- пробел в скобках - означает пробел! Скобки не нужны!

Добавлено через 1 минуту
Т.е. пиши просто: "/F 500000"
1
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 01:37  [ТС] 10
Исправил, поставил /F 50000000 , но все равно те же ошибки. А код точно правильный? У вас все нормально работает?

В смысле ошибки не с "/F 50000000", а с переполнением этим.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.05.2013, 01:49 11
Пффф... В 27-й строке ты удаляешь массив factorials, а потом в 30-й ты его снова используешь! Зачем!?)))

Добавлено через 54 секунды
И зачем тебе 26-я строка!?

Добавлено через 1 минуту
И замени везде тип long long на unsigned long long.

Добавлено через 26 секунд
И стек сдесь не при чем..

Добавлено через 3 минуты
В общем удаляй 26-ю, и с 28-й по 32-ю.
1
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 12:46  [ТС] 12
Ну я пробовал и удалять и нет, результат один и тот же. А если удалить условие и новый ввод то получится безконечный цикл, задумка в том чтоб программа принимала и обрабатывала значения до ввода "0", или чего-то еще, это не важно. Используя при этом эту долбаную рекурсию. Или я тебя не правильно понял, хз.

Добавлено через 9 минут
Меня смущает то что при каждом запуске программы, ошибка появляется при вводе совершенно разных значений. Если так и должно быть, то норм.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.05.2013, 12:50 13
У меня так работает без проблем:
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;
 
void rekursija(unsigned long long factorials[], int ArSize);
 
int main()
{
    cout << "Pls enter the number: " << endl;
    int ArSize;
    cin >> ArSize;
    unsigned long long * factorials = new unsigned long long[ArSize];
    
    rekursija(factorials, ArSize);
 
    delete []factorials;
 
    system ("pause");
    return 0; 
}
 
void rekursija(unsigned long long factorials[], int ArSize)
    {
    factorials[1] = factorials[0] = 1;
    for (int i = 2; i < ArSize; i++)
    {
        factorials[i] = i * factorials[i-1];
    };
    for (int i = 0; i < ArSize; i++)
        std::cout << i << "! = " << factorials[i] << std::endl;
}
Если хочешь зациклить пока не введут 0, тогда делай это в main.
1
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 12:56  [ТС] 14
Но нету рекурсии, типа использования функции в функции.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.05.2013, 13:04 15
А ну да. Я вообще не понимаю зачем тебе массив. Нужна рекурсивная функция факториала:
C++
1
2
3
4
unsigned long long factorial( unsigned long long i ) {
    if ( i <= 1 ) return 1;
    return i * factorial( i - 1 );
}
Ставь её в цикл и заполняй массив, если без него никак.
1
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 13:24  [ТС] 16
Действительно, массив не нужен был, так как надо было только отображать. Я завис на этом, так как в предыдущей проге с факториалом использовался массив. Спасибо
0
09.05.2013, 13:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2013, 13:24
Помогаю со студенческими работами здесь

Рекурсивная функция
Здравствуйте, помогите написать программу на языке С++ Для заданного одномерного массива A из N...

рекурсивная функция
Описать рекурсивную функцию вычисления значения по указанной формуле. Понимаю, что программа...

Рекурсивная функция
Здравствуйте! Осваиваю рекурсивные функции на C++ Написал классический алгоритм (динамическое...

Рекурсивная функция y=3x+5
Здравствуйте! Помогите написать прогу(или если есть готовое решение буду благодарен! Век помнить...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru