Получение разных ответов, если я передаю переменную ++ и переменную + 1 в рекурсивном вопросе, т.е. выводим все возможные комбинации r элементов в данном массиве - PullRequest
0 голосов
/ 23 октября 2019
#include<bits/stdc++.h>
using namespace std;

int arr[]={1,2,3,4,5};
int r=3;

int rec(int index,int cnt,vector<int> v)
{
    if(cnt==r)//if required no is reach
    {
        cout<<"IN ";
        for(int i=0;i<v.size();i++)
        {
            cout<<v[i]<<" ";
        }
        cout<<endl;
        return 1;
    }
    if(index>=5)//crossing the array
    {
        return 0;
    }

    int a;

    vector<int> temp;
    temp=v;
    temp.push_back(arr[index]);

    a=rec(index+1,cnt+1,temp)+rec(index+1,cnt,v);

    return a;
}

int main()
{
    vector<int> v;
    int cnt=0;
    int a=rec(0,cnt,v);
    cout<<"a="<<a<<endl;
    return 0;
}

```either select the element at the given index and increase the cnt or i dont select the element.In both cases I move forward.The total no of ways in which it can happen is stored in variable a.
(1,2,3) is the same as (2,1,3) or(3,2,1)
I am getting different outputs<br>
CASE-1

a = rec (index + 1, cnt ++, temp) + rec (index + 1, cnt, v);

OUTPUT

IN 1 2 3 IN 1 2 4 IN 1 25 IN 1 3 4 IN 1 3 5 IN 1 4 5 IN 2 3 4 IN 2 3 5 IN 2 4 5 IN 3 4 5 a = 10

CASE-2

a = rec (index + 1, cnt+ 1, temp) + rec (index + 1, cnt, v);

OUTPUT

IN 1 2 IN 1 3 IN 1 4 IN 1 IN 2 3 IN 2 4 IN 2 IN 3 4 IN 3IN = 10


I get different outputs for cnt++ and cnt+1 though both are the same

Why is this happening

Ответы [ 3 ]

1 голос
/ 24 октября 2019

причина та же здесь

см. Предупреждение: main.cpp: 39: 21: предупреждение: операция с 'cnt' может быть неопределенной [-Wsequence-point]

Рассмотрим ваш код следующим образом:

#include <iostream>
#include <vector>
using namespace std;

int arr[] = { 1,2,3,4,5 };
int r = 3;

static int callCounter = 0;

int rec(int index, int cnt, vector<int> v)
{
    std::cout << "1+cnt = "<< 1 + cnt << endl;

    if (cnt == r)//if required no is reach
    {
        cout << "IN ";
        for (int i = 0; i < v.size(); i++)
        {
            cout << v[i] << " ";
        }
        cout << endl;
        return 1;
    }
    if (index >= 5)//crossing the array
    {
        return 0;
    }

    int a;

    vector<int> temp;
    temp = v;
    temp.push_back(arr[index]);

    //int firstCall = rec(index + 1, cnt, v);
    //int secondCall = rec(index + 1, ++cnt, temp);
    //a = secondCall + firstCall;

    `enter code here`a = rec(index + 1, ++cnt, temp) + rec(index + 1, cnt, v);
     //a = rec(index + 1, 1+cnt, temp) + rec(index + 1, cnt, v);
    ++callCounter;
    std::cout << "callCounter " << callCounter <<endl;
    return a;
}

int main()
{
    vector<int> v;
    int cnt = 0;
    int a = rec(0, cnt, v);
    cout << "a=" << a << endl;

    return 0;
}

Выход из GCC 9.2:

main.cpp: In function 'int rec (int, int, std :: vector) ':

main.cpp: 17: 21: предупреждение: сравнение целочисленных выражений различной подписи:' int 'и' std :: vector :: size_type '{aka'long unsigned int'} [-Wsign-compare]

17 |for (int i = 0; i

main.cpp: 39: 21: предупреждение: операция над 'cnt' может быть неопределенной [-Wsequence-point]

39 |a = rec (index + 1, ++ cnt, temp) + rec (index + 1, cnt, v);

1 голос
/ 23 октября 2019

Порядок оценки не определено без последовательности для:

rec(index + 1, cnt++, temp) + rec(index + 1, cnt, v);
  • cnt++ [A]
  • rec(index + 1, cnt, temp) [B]
  • rec(index + 1, cnt, v) [C]

[A] должно произойти до [B].

И:

Если побочный эффект наскалярный объект не секвенирован относительно вычисления значения с использованием значения того же скалярного объекта, поведение не определено.

Вы читаете [C] и пишете cnt [A] в неупорядоченном, выесть UB.

0 голосов
/ 23 октября 2019

Поскольку cnt++ использует оператор приращения postfix , он будет увеличивать локальную переменную cnt после того, как передается функции, а не раньше. Попробуйте вместо этого использовать префиксный оператор ++cnt.

...