LINUX.ORG.RU

Помогите разобраться с программой

 ,


0

1

Нужно рекурсивно вывести количество одинаковых цифр из вектора.

 #include <iostream>
#include <vector>


int counter(std::vector<int>& vec, int digit, int vec.size()){

  int i = 0;
  int count = 0;

  if(vec.size() == 0)
    return count;

  if(digit == vec[i])
    count++;
  i++;
  return counter(vec, digit, vec.size() - 1);

}



int main()
{
  std::vector<int> vec = {1, 2, 4, 4, 4, 6};
  std::cout << counter(vec, 4, 6) << "\n";

  //std::vector<int> vec1 = {0, 0};
  //std::cout << counter(vec1, 4);

  //std::vector<int> vec = {4, 4, 4, 4, 4};
  //std::cout << counter(vec, 4) << "\n";
}


Последнее исправление: cetjs2 (всего исправлений: 1)

Зачем тебе С++? Ты даже не знаком с STL. Лучше сначала пиши на С.

BceM_IIpuBeT ★★☆☆☆
()

И оно вообще не компилируется. Ты там на паре зачет сдаешь, или что?!

BceM_IIpuBeT ★★☆☆☆
()

int counter(std::vector<int>& vec, int digit, int vec.size()){

Что у тебя в последнем параметре?

if(vec.size() == 0)
return count;

Ты так из рекурсии не выйдешь. У тебя не уменьшается количество элементов в векторе.

ox55ff ★★★★★
()

Зачем здесь рекурсия, совершенно непонятно, но если очень хочется, то можно как-то так

#include <iostream>
#include <vector>


unsigned counter(std::vector<int>& vec, int digit, unsigned count, unsigned i){

  if(i==vec.size())
    return count;

  if(digit == vec[i])
    count++;
  i++;
  return counter(vec, digit, count, i);
}



int main()
{
  int arr[] = {1, 2, 4, 4, 4, 6};
  std::vector<int> vec(arr, arr+sizeof(arr)/sizeof(int));
  std::cout << counter(vec, 4, 0, 0) << "\n";

  return 0;
}
aureliano15 ★★
()

Версия без аккумулятора. Думаю, это плохо скажется на хвостовой рекурсии.

int counter(std::vector<int>& vec, int digit, int vecSize)
{
    int i = 0;

    if (vecSize == 0)
        return i;

    if (vec[vecSize - 1] == digit)
        i++;

    return i + counter(vec, digit, vecSize - 1);
}

int main()
{
    std::vector<int> vec = { 1, 2, 4, 4, 4, 6 };
    std::cout << counter(vec, 4, vec.size()) << "\n";

    std::vector<int> vec1 = { 0, 0 };
    std::cout << counter(vec1, 4, vec1.size()) << "\n";

    std::vector<int> vec2 = { 4, 4, 4, 4, 4 };
    std::cout << counter(vec2, 4, vec2.size()) << "\n";

    std::vector<int> vec3 = {};
    std::cout << counter(vec3, 4, vec3.size()) << "\n";

    std::cout << std::flush;

    return 0;
}

ox55ff ★★★★★
()

господа, не надо решать такие задачи за студентов. тут не просто ошибки в коде. тут тотальнейшее непонимание всех основ. такого студента надо отправлять читать сначала основы С, K&R от корки до корки со всеми упражнениями, и только через год допускать до плюсов. а не решать за него примитивные задания. а то потом такие студенты, понасдававшие зачётов за счёт добрых лорчан, получат фиктивные дипломы и придут к вам устраиваться на работу. хватит уже полуфабрикатов в профессии.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

То же хотел написать, но было лень. Сам «учусь» с такими «студентами» в «вузе» на факе программной инженерии...

BceM_IIpuBeT ★★☆☆☆
()
Последнее исправление: BceM_IIpuBeT (всего исправлений: 2)
Ответ на: комментарий от SerjVec

Давай я попробую! Будешь дальше так учиться, будешь потом на PHP говнокодить за 20к в месяц (Есть случаи) :D

Deleted
()
Ответ на: комментарий от SerjVec

давай только обосновывай

int counter(std::vector<int>& vec, int digit, int vec.size())

На этом можно заканчивать.

BceM_IIpuBeT ★★☆☆☆
()
Ответ на: комментарий от ox55ff

плохо скажется на хвостовой рекурсии

У тебя подмена понятий: рекурсия может или быть, или не быть хвостовой, и последнее может плохо сказаться на оптимизации в цикл.

anonymous
()

Нужно рекурсивно вывести количество одинаковых цифр из вектора.

Одинаковых? Какая разница тогда, как их выводить? Что-то я нифига не понял.

Meyer ★★★★★
()

С итераторами и шаблонами, как ты любишь (:

#include <iostream>
#include <iterator>

template<class T>
size_t count(T begin, T end, unsigned number) {
    if(begin == end) {
        return 0;
    } else {
        if(*begin == number) {
            return 1 + count(std::next(begin), end, number);
        } else {
            return count(std::next(begin), end, number);
        }
    }
}

int main() {
    unsigned array[] = { 1, 2, 4, 4, 4, 6 };
    std::cout << count(std::cbegin(array), std::cend(array), 4) << std::endl;
    return 0;
}

Deleted
()
Ответ на: комментарий от Deleted

Тут нет ничего сложного, я тебя уверяю.

Так-то да, но если ТС - студент, подобное решение окажет ему медвежью услугу, породив дополнительные вопросы со стороны препода. Я когда-то давно так помог одногруппнику с курсовой - он ее 2 месяца не мог сдать, хотя для меня решение казалось элементарным.

Meyer ★★★★★
()
Последнее исправление: Meyer (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

Ну так подскажи, растолкуй и научи. А то так нос задираешь, что скоро потолок будешь царапать. И кстати я не согласен, что плюсовику нужно знать си.

rumgot ★★★★★
()
Ответ на: комментарий от Meyer

Судя по тредам, которые ОП создаёт уже довольно продолжительное время, он или максимум классе в 8, или совершенно необучаемый — в первом случае он со временем дойдёт и до шаблонов, а во втором — его в любом случае числанут.

anonymous
()
Ответ на: комментарий от SerjVec

Тебе книга поможет, а не вопросы на форуме. Я тебе в прошлой теме уже писал.

flyshoot
()

Судя по всему, персонаж не обучаем, я за бан.

flyshoot
()
Ответ на: комментарий от rumgot

Растолковывать при отсутствии элементарной базы — потеря времени.

flyshoot
()
Ответ на: комментарий от andreyu

одинаковых цифр из вектора.

Он это задание слишком буквально.

Простого массива было бы вполне достаточно.

int counter(int *arr, int digit, int size){
if( size == 0)
    return 0;
if(arr[0] == digit)
    return 1+counter(++arr, digit, --size);
else
    return counter(++arr, digit, --size);
}

//надеюсь, что ошибок нет

Zomba444ok
()
Ответ на: комментарий от rumgot

Работая с C++ невозможно обойти стороной C, и что бы писать плюсовеку на C достаточно знать чего C не умеет.

SR_team ★★★★★
()
Ответ на: комментарий от SR_team

Ну вот в каких случаях плюсовику нужен С? При использовании С-библиотек если только. Но это если и нужно, то вызвать С-функции плюсовик сможет, ведь синтаксис он знает(как подмножество С++). Но под термином «знать С» я подразмеваю не только синтаксис, но также умение думать на языке, опыт решения на нем сложных задач и проблем, знание подводных камней и преимуществ языка. Так ли все это необходимо плюсовику? Т.е. конечно, любые знания не лишни никому, но так ли уж необходимы?

rumgot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.