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

Комбинаторика! Число сочитаний - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Цикл http://www.cyberforum.ru/cpp-beginners/thread634878.html
Начал изучать C++ неделю назад. Теперь начал решать некоторые задачи. И возникли у меня некоторые сложности с циклами... Требуется ваша помощь... Задача: Переведите натуральное число из двоичной...
C++ Работа с фс Всем привет, мне необходимо посчитать количество файлов в директории и в зависимости от их количества разделить их на 4 или 8 папок. Я слышала есть библиотеки fstream и boost, но как правильно это... http://www.cyberforum.ru/cpp-beginners/thread634869.html
Конструктор копирования C++
Всем привет. У меня такая проблема: есть некий класс, допустим Test: class Test { protected: int value; public : Test(int v)
Случайные(псевдослучайные) числа C++
Здравствуйте! Я знаю, что было много тем по поводу рандомных чисел в С++.Но всё же. Возникла у меня проблема с получением большого кол-ва случайных(точнее псвдослучайных) чисел, которые меньше...
C++ Ошибка при вызове функции http://www.cyberforum.ru/cpp-beginners/thread634834.html
В функции NewWords вызывается функция correct,при отладке я не могу войти в эту функцию,к тому же потом не выводится элементы объекта класса words и ID в программе на данный момент вызываются лишь 2...
C++ генерирую случайные числа srand(time(NULL)); rand()%10; Всем привет, генерирую случайные числа, подскажите, пожалуйста, почему при запуске приложения числа постоянно генерируются? Как можно сделать так, чтобы при каждом... подробнее

Показать сообщение отдельно
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
13.08.2012, 05:31
Цитата Сообщение от mr_free Посмотреть сообщение
Да, и еще почему в данных задачах не стоит использовать рекурсию?
Стека жрёт много. Смотрим количество сочетаний без возврата и без учёта порядка. Рекурсия+ цикл:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <windows.h>
#include <stdio.h>
#define kolichestvo_chisel 9
#define kolichestvo_drugih_chisel 7
using namespace std;
 
int kk= 0;
 
 
 
void func_recurs (int nomer_funktsii, int nomer_elementa, int kol_ostavshihsa_chisel,  int* stroka, int* array) {
 
 printf ("%x\n", &nomer_funktsii);
 kk++;
 
 for (int i= nomer_elementa; i< kolichestvo_chisel- kol_ostavshihsa_chisel+ 1; i++) {
 
  if (nomer_funktsii< kolichestvo_drugih_chisel- 1) {
   array [nomer_funktsii]= stroka [i];
   for (int j= 0; j< kk; j++)
    printf (" ");
   func_recurs (nomer_funktsii+ 1, i+ 1, kol_ostavshihsa_chisel- 1, stroka, array);
  }
 
  else {
   array [nomer_funktsii]= stroka [i];
//   for (int i= 0; i< kolichestvo_drugih_chisel; i++)
//    printf ("%d ", array [i] );
//    printf ("\n");
  }
 }
 
 kk--;
}
 
 
int main () {
 
 int stroka []= {21, 34, 20, 12, 3, 2, 7, 67, 56};
 int array [kolichestvo_drugih_chisel];
 func_recurs (0, 0, kolichestvo_drugih_chisel, stroka, array);
 
 
 
 getchar ();
 return 0;
}
И вывод смотри, эти ступеньки- эта глубина рекурсии. И как видишь, углубление происходит всё дальше и дальше в стек и однажды он переполнится (вправо по ступенькам)
...Я сделал, чтобы глубина рекурсии была не больше kolichestvo_drugih_chisel. Это фигня, это очень мало. Стек не переполнится. Но ведь это я СДЕЛАЛ. (Видишь, использовал ЦИКЛ+ рекурсию). А можно было бы и не сделать, обойтись одной рекурсией и пиши пропало, ступеньки вылетели бы туда непонятно куда и крах программы.

И да, время отладки она вылетала у меня не раз и не два из-за переполнения стека (ошибка трудноуловимая). А если ты вместо рекурсии используешь цикл, одной проблемой меньше.
0
Миниатюры
Комбинаторика! Число сочитаний  
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru