【发布时间】:2012-03-07 21:26:43
【问题描述】:
我正在尝试编写一个函数,该函数使用 C 中的 forks 从给定的 int n 递归计算得到的斐波那契数。
这里是函数说明:如果doPrint为真,打印它。否则,将其提供给父进程。解决方案应该是递归的,并且它必须为每个调用派生一个新的孩子。每个进程都应该只调用一次 doFib()。方法签名不能更改。不能使用辅助函数。
这是这个问题的延续:Recursive Fibonacci using Fork (in C)
不幸的是,我在上一篇文章中从未找到解决问题的方法,但这是我修改后的代码。我以为我已经弄清楚了(伪代码明智),但后来发现我仍然不确定一些部分。
在这一点上,这只是我的娱乐。这不是家庭作业,我的课堂上不会再涉及(在最近的测试通过后)。
static pid_t root_pid;
// Function to return exit code for PID
static int exitcode(pid_t pid)
{
pid_t retpid;
int status;
retpid = waitpid(pid, &status, 0);
if (pid != retpid)
{
printf("waitpid error\n");
}
return WEXITSTATUS(status);
}
static void doFib(int n, int doPrint)
{
root_pid = getpid();
pid_t pid1;
int status1;
pid_t pid2;
int status2;
if(n < 2) // Base case, exit back to parent?
{
exit(n);
}
else // if not base case, fork child processes
{
pid1 = fork();
if (pid1 == 0) // Child Process 1 (for fib(n-1))
{
doFib(n-1, doPrint);
exit(n-1);
}
else if (pid1 > 0) // Parent Process
{
pid2 = fork();
if (pid2 == 0) // Child Process 2 (for fib(n-2))
{
doFib(n-2, doPrint);
exit(n-2);
}
// Get value from child process 1
status1 = exitcode(pid1);
// Get value from child process 2
status2 = exitcode(pid2);
// When to print?
if (getpid() == root_pid)
{
int result = status1 + status2;
if (doPrint)
{
printf("%d\n", result);
}
else
{
exit(result);
}
}
}
}
}
几个问题...
-
我需要为每个子进程调用这两个函数吗?
doFib(n-1, doPrint); exit(n-1); - 我一开始的基本情况是否正确? (n
- 最后我的基本情况是否正确? (何时打印)
感谢您的帮助。
【问题讨论】:
-
当你探索这个编码问题时,你应该考虑到斐波那契问题的递归解决方案是一种非常糟糕的方法来获得结果,因为它的效率非常低。
-
@Pointy 欣赏两美分。这是我为准备期中考试而完成的一系列编码问题,但我从来没有弄清楚这一点。至少可以说,这一直困扰着我,但我确信这主要是为了教育目的。
标签: c recursion fork fibonacci