int f(int x)
{ if(x<=2)
return 1;
return f(x-2)+f(x-4)+1;
}
当x=10时候,程序共调用几次?
分析:针对这样的题目在别的地方看到的比较好的方法是用树来表示
10
8 6
6 4 4 2
4 2 2 0 2 0
2 0
图中树的节点数是15,所以是调用了15次
int main() {
fork()||fork();
}
共创建了几个进程?
分析:首先,第一个fork()执行后,产生一个父进程的副本(返回值为子进程ID)和一个子进程(返回值为0),如下图所示,由||知道,父进程的左分支终止,继续执行右分支的分裂,再产生一个子进程的副本和一个子进程,即下图中的子1,因此总共产生了3个进程,如图中的圈圈
注意:圆圈才是创建的进程,而非圆圈部分是进程的副本而已,并不是创建的,而是复制的。
分析二 : 一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。