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

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

Восстановить пароль Регистрация
 
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
08.05.2013, 22:48     Рекурсивная функция #1
Походу что-то с массивами не то, когда ввожу слишком большое число (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);
        };
 
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2013, 22:48     Рекурсивная функция
Посмотрите здесь:

Рекурсивная функция C++
Рекурсивная функция C++
C++ Рекурсивная функция
C++ Рекурсивная функция
Рекурсивная функция. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
08.05.2013, 23:43     Рекурсивная функция #2
ошибку приведи
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 23:47     Рекурсивная функция #3
А sizeof( long long ) у тебя чему равен?
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 00:34  [ТС]     Рекурсивная функция #4
Рекурсивная функция

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

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

http://msdn.microsoft.com/en-us/libr...(v=vs.71).aspx
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 01:28  [ТС]     Рекурсивная функция #8
Я так понял вот тут надо было изменения сделать. Но тогда при построении ошибка
1>cl : командная строка error D8021: недопустимый числовой аргумент "/F[500000]number"
Рекурсивная функция
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
09.05.2013, 01:33     Рекурсивная функция #9
Нет, ты не так пишешь. Надо: /F[пробел]размер_стека --- пробел в скобках - означает пробел! Скобки не нужны!

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

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

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

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

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

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

Добавлено через 9 минут
Меня смущает то что при каждом запуске программы, ошибка появляется при вводе совершенно разных значений. Если так и должно быть, то норм.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
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.
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 12:56  [ТС]     Рекурсивная функция #14
Но нету рекурсии, типа использования функции в функции.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
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 );
}
Ставь её в цикл и заполняй массив, если без него никак.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 13:24     Рекурсивная функция
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
09.05.2013, 13:24  [ТС]     Рекурсивная функция #16
Действительно, массив не нужен был, так как надо было только отображать. Я завис на этом, так как в предыдущей проге с факториалом использовался массив. Спасибо
Yandex
Объявления
09.05.2013, 13:24     Рекурсивная функция
Ответ Создать тему
Опции темы

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