我试图写递归使用叉中C.递归斐波那契在C(铂2)使用叉
这里,给定的intÑ计算所得的斐波纳契数的函数的功能是规范:如果doPrint为true,则打印它。否则,将其提供给父进程。解决方案应该是递归的,并且它必须为每个调用分派一个新的子节点。每个进程应该只调用一次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 < 2)
- 我的基本情况是否正确? (何时打印)
谢谢你的帮助。
当你探索这个编码问题,你应该考虑的是一个斐波纳契问题的递归解决方案是获得结果的一种非常糟糕的方式,因为它效率非常低。 – Pointy 2012-02-16 15:03:02
@积分欣赏两美分。这是我为完成中期课程而准备的一系列编码问题,我从来没有想过这个问题。我一直在打扰至少,但我相信这主要是为了教育目的。 – CODe 2012-02-16 16:37:51