while 循环比 for 循环的自由度更高。 每一次嵌套都是一次“升维”

  • 迭代:“自下而上”地解决问题。从最基础的步骤开始,然后不断重复或累加这些步骤,直到任务完成。

  • 递归:“自上而下”地解决问题。将原问题分解为更小的子问题,这些子问题和原问题具有相同的形式。接下来将子问题继续分解为更小的子问题,直到基本情况时停止(基本情况的解是已知的)。

  • 函数的上下文数据都存储在称为“栈帧空间”的内存区域中,直至函数返回后才会被释放。因此,递归通常比迭代更加耗费内存空间

  • 递归调用函数会产生额外的开销。因此递归通常比循环的时间效率更低。

  • 普通递归:求和操作是在“归”的过程中执行的,每层返回后都要再执行一次求和操作。

  • 尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。 image.png image.png

在函数内递归调用了两个函数,这意味着从一个调用产生了两个调用分支。如图 2-6 所示,这样不断递归调用下去,最终将产生一棵层数为  的递归树(recursion tree)。 image.png

两种工作机制与栈的“先入后出”原则异曲同工