【发布时间】:2013-09-13 21:50:44
【问题描述】:
首先,我欣然承认这是功课。但是我一直把头撞在墙上,我就是不明白。赋值参数如下:“递归计算指定数。如果print为真,则打印。否则,提供给我的父进程。
注意:解决方案必须是递归的,并且必须为每个调用派生一个新的孩子。每个进程应该只调用一次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。任何更改我make 会产生不同的垃圾值,但最终仍为 17。
我相信问题在于我使用了 waitpid,但我不知道它会是什么。我是否正确假设这是我的错误的根源?我搜索了教科书、手册页、互联网等,但我不知道我能解决什么问题。任何帮助将不胜感激。谢谢。
【问题讨论】:
-
你能正确缩进你的代码吗?
-
不鼓励在生产代码中使用递归。参见例如 NASA 指导方针:lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf
-
很高兴他们正在计算 finincci 数字 递归;因为教导学生
O(2^n)代码是可以接受的,这肯定会让他们在以后的生活中取得成功。 -
很抱歉出现缩进问题——我以前从未在 Stack Overflow 上发布过代码。不幸的是,我别无选择。解决方案必须是递归的并且必须使用 fork。这项任务在基础级别上很愚蠢,但我的挫败感源于我没有得到的任何 waitpid 元素。 (除非在我没有看到的递归中有明显的错误。)
-
@awashburn 好吧,
O(phi^n),但重点。只要他们学会了记忆的东西,事情应该不会太糟糕。