Member 14015940 Ответов: 2

Как сделать этот алгоритм с рекурсией вместо фактического, который использует цикл


Задача алгоритма состоит в том, чтобы рассчитать распространение заболевания в нормальной популяции, начиная с 1 больного человека.


Теперь алгоритм, который я сделал, работает с 2 для циклов.
Первый вопрос: не могли бы вы найти советы для фактического кода?

Второй вопрос: как я могу сделать это с помощью рекурсии функции epidemy?

Что я уже пробовал:

Фактическая работа кода:
// Epidemology of a disease
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int read_input();
int epidemy(int sick_people, int time_past, int sane_people);

int main(){
	
	int sick_people = 1;
	int time_past;
	int sane_people;
	
	srand(time(NULL));
	
	time_past = read_input();
	sane_people = read_input();
	
	epidemy( sick_people , time_past, sane_people  );
	
	return 0;
}


int read_input(){
	printf(" Write a positive integer.\n");
	
	int val;
	
	while (scanf("%d", &val) != 1 ||  val < 0){
		
		scanf("%*[^\n]%*c");
		printf("Input incorrect. Write a positive integer.\n");	
	}
	
	printf("The input was %d\n",  val);
	
	return val;
}


// this function is going to produce a random number between 0 and 1 , then i will compare with the probability of being sick
// if x randomly generated is minor than p , sick people will increase and sane people will decrease by 1
// then i stamp sick people when t matches the time that i asked in input in my main function
// probability is also a variable depending from sane people at each time
int epidemy(int sick_people, int time_past ,int sane_people){
	int t = 0;
	int i = 0;
	float p = 0.001;
	
	sane_people= sane_people- sick_people;
	
	for(t = 0  ;t <time_past; t++){
		
		for(i = 0 ; i <= sane_people ; i++){
			
			float x = rand() / (float) RAND_MAX;
			if(x <= p){
				
					sick_people=sick_people+1;
					sane_people= sane_people-1;
				}
				
			if(sane_people<=0){
				// people infected at time t
				printf("Sick people at time %d are %d\n", t , sick_people);
				exit(0);
			}
			}
			p = p * sick_people;
				if(sane_people<=0){
					
					// people infected at time t
				printf("Sick people at time %d are %d\n", t , sick_people);
				exit(0);
			}
		}
		
	printf("Sick people at time %d are %d\n", t , sick_people);		
	}

CPallini

"Второй вопрос: как я могу сделать это с рекурсией функции epidemy?"
Разве это достойно? Я имею в виду, что итерация выглядит просто естественным способом справиться с таким сценарием.

2 Ответов

Рейтинг:
2

David O'Neil

Замените каждый for в epidemy с функцией. Таким образом, вы можете рекурсировать свою рекурсию.


Рейтинг:
1

KarstenK

Место в конце вашего epidemy новый вызов функции с вычисленным значением. Сделайте несколько чеков для отпуска, например sane_people > 0 или какое-то максимальное время.