一个简单的递归问题,可以模拟计算机病毒的传播

时间:2019-02-16 22:04:52

标签: c++ recursion simulation

我要解决的问题是:

  • 一种计算机病毒将在第0天感染100台计算机。
  • 70%的受感染计算机中的每一个将再感染一台计算机。
  • 有2位计算机科学家可以解决此问题。他们每个人都可以在第一天修复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 :(得分:0)

您忘记在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;在循环内。

答案 1 :(得分:0)

您在第n天的递归尝试使用第n + 1天的结果的70%。这将导致无限递归。您必须使用第一天的70%,它才能正常工作。现在不是前一天的70%,而是70%,所以不是* 0,7而是* 1,7

并且您需要考虑到感染的计算机数量不能为负数。

最后,您高估了维修量:在第1天的维修工作是第2天,在第2天的维修工作是4天,但是由于第1天的递归中已经计入了第1天的第2天,因此您推论了两次。因此,您应该只计算第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;
}

Online demo