Наверху, я с готовностью признаю, что это домашнее задание. Но я ударился головой о стену на этом, и я просто не понимаю. Параметры присваивания следующие: «Рекурсивно вычислить указанный номер.Если печать верна, распечатайте ее, в противном случае предоставьте ее моему родительскому процессу.Рекурсивный Фибоначчи в C, используя fork()
ПРИМЕЧАНИЕ. Решение должно быть рекурсивным, и оно должно развить новый ребенок для каждого вызов. Каждый процесс должен вызывать doFib()
ровно один раз ».
Это мой первый опыт использования fork(), и хотя я думаю, что понимаю, я просто не могу окутать голову, почему я не получаю правильный ответ. Вот мой код, который довольно зачаточном:
doFib(int n, int doPrint)
{
int status;
int print;
pid_t pid1;
pid_t pid2;
int sum1;
int sum2;
if (n < 2)
exit(n);
pid1 = fork();
if (pid1 == 0)
{
doFib(n-1, doPrint);
exit(n-1);
}
pid2 = fork();
if (pid2 == 0)
{
doFib(n-2, doPrint);
exit(n-2);
}
while ((pid1 = waitpid(-1,&status, 0)) >0)
{
if(WIFEXITED(status))
sum1 += WEXITSTATUS(status);
}
while ((pid2 = waitpid(-1,&status, 0)) >0)
{
if(WIFEXITED(status))
sum2 += WEXITSTATUS(status);
}
print = sum1 + sum2;
if(doPrint)
printf("%d\n", print);
else
exit(0);
}
Фибоначчи является одним из первых примеров рекурсии я учил, и я его понимаю на базовом уровне. Тем не менее, когда я запускаю свою программу, с 10 в качестве заданного аргумента (хотя любой аргумент приводит к неправильным результатам), я получаю поток мусора, заканчивающийся на: -1861761537
(есть много этих отрицательных чисел), 17. Любые изменения, которые я делаю в результате в разных значениях нежелательной почты, но все равно в конечном итоге на 17.
Я считаю, что проблема в моем использовании waitpid, но я не знаю, что это будет. Правильно ли я полагаю, что это источник моей ошибки? Я просмотрел учебник, справочные страницы, Интернет и т. Д., И я не знаю, что я могу исправить. Любая помощь будет принята с благодарностью. Спасибо.
Можете ли вы правильно откомпоновать код. – hetepeperfan
Использование рекурсии препятствует производственному коду. См. Например, ориентиры NASA: http://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf – matcheek
Рад, что они вычисляют числа fininccci ** рекурсивно **; потому что преподавание студентов, что ** код O (2^n) '** является приемлемым, определенно поставит их для успеха позже в жизни. –