Простая рекурсивная задача для симуляции распространения компьютерного вируса - PullRequest
0 голосов
/ 17 февраля 2019

Проблема, которую я пытаюсь решить, такова:

  • Вид компьютерного вируса заразит 100 компьютеров в день 0.
  • Каждый из 70% зараженного компьютера заразитеще один компьютер.
  • Есть 2 компьютерных ученых, которые решают проблему.Каждый из них может починить 1 компьютер в 1-й день.
  • Каждый последующий день из-за увеличения опыта они могут починить вдвое больше компьютеров, чем в предыдущий день.
  • Итак, какмного компьютеров все еще заражены n дней спустя?
    А как будут цифры со дня 0 до дня 20?

Чтобы решить эту проблему, я написал следующий код:

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

int computervirus(int n){ //n:Tage
    int nr_virus= 100;
    int nr_fixed;
    int rest = 0;
    if(n == 0) return 100;

    if(n <= 20){ 
        nr_virus += computervirus(n-1)*0.7;
        nr_fixed = pow(2,n);
        rest = nr_virus - nr_fixed;
    }

    return rest;

}

int main(){

    cout << endl;
    for(int i=0; i <= 20; i++){ 

        cout << "at the "<< i << " .day are still "<< computervirus(i) << " infected Computers\n" <<endl;   
    }
    return 0;
}

Выходные данные для числа (зараженные компьютеры) просто неверны, поскольку скорость заражения определенно выше, чем при восстановлении, по крайней мере, в первые 9 дней.Я не уверен, где проблема.Вы можете помочь?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Ваша рекурсия за день n старается использовать 70% результата дня n + 1.Это вызывает бесконечную рекурсию.Вы должны использовать 70% первого дня, и это будет работать.Сейчас это не 70% предыдущего дня, а на 70% больше, поэтому не * 0,7, а * 1,7.

И нужно учитывать, что не может быть отрицательного числа зараженных компьютеров.

Наконец, вы переоцениваете ремонт: в 1-й день это 2, во 2-й день это 4, но, поскольку 2-й день 1 уже был учтен в вашей рекурсии на 1-й день, вы выводите их дважды.Таким образом, вы должны считать только дополнительные компьютеры с фиксированным днем ​​n.Итак, Pow (2, n-1).

Исправленный код будет выглядеть следующим образом:

int computervirus(int n){ //n:Tage
    int nr_virus= 100;
    int nr_fixed = 0;
    int rest = 0;

    if(n>0){ 
        nr_virus = computervirus(n-1)*1.7;  // n-1 not n+1
        if (n==1) 
            nr_fixed = 2;
        else nr_fixed = pow(2,n-1); 
    }
    rest = nr_virus - nr_fixed;
    if (rest<0) 
        rest = 0;
    return rest;
}

Демонстрационная версия

0 голосов
/ 17 февраля 2019

Вы забыли использовать скобки вокруг тела цикла for

int main(){

    for(int i=0; i <= 20; i++)
    { 
        cout << endl;
        cout << "at the "<< i << " .day are still "<< computervirus(i) << " infected Computers\n" <<endl;   
    }
    return 0;
}

Поставьте левую скобку { перед первым оператором в вашем цикле и правую скобку } после последнего.

Поскольку фигурные скобки отсутствовали, только первый оператор cout << endl; был внутри цикла.

...