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函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。



子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。 


分析程序调用几次函数_fork函数_02