递归与迭代之间的区别

作者: Laura McKinney
创建日期: 1 四月 2021
更新日期: 4 可能 2024
Anonim
059 递归算法详解 递归和迭代效率测试
视频: 059 递归算法详解 递归和迭代效率测试

内容


递归和迭代都重复执行指令集。递归是指函数中的语句重复调用自身时的情况。迭代是循环重复执行直到控制条件变为假。递归和迭代之间的主要区别在于 递归 是一个过程,始终应用于功能。的 迭代 应用于我们要重复执行的指令集。

  1. 比较表
  2. 定义
  3. 关键差异
  4. 结论

比较表

比较依据递归迭代
基本的函数主体中的语句调用函数本身。允许重复执行指令集。
格式在递归函数中,仅指定终止条件(基本情况)。迭代包括初始化,条件,循环内语句的执行以及更新(递增和递减)控制变量。
终止函数主体中包含条件语句,以强制函数返回而不执行递归调用。重复执行迭代语句,直到达到特定条件为止。
条件如果函数未收敛到称为(基本情况)的某种条件,则会导致无限递归。如果迭代语句中的控制条件永远不会变为假,则将导致无限迭代。
无限重复无限递归会导致系统崩溃。无限循环重复使用CPU周期。
已应用递归始终应用于函数。迭代应用于迭代语句或“循环”。
每次调用函数时,该堆栈用于存储一组新的局部变量和参数。不使用堆栈。
高架递归具有重复函数调用的开销。没有重复函数调用的开销。
速度执行速度慢。快速执行。
代码大小递归可减少代码的大小。迭代使代码更长。


递归的定义

C ++允许函数在其代码内调用自身。这意味着函数的定义拥有对自身的函数调用。有时也称为“循环定义”。每次函数调用自身时都会重新创建函数使用的一组局部变量和参数,并将它们存储在堆栈的顶部。但是,每次函数调用自身时,它不会创建该函数的新副本。递归函数不会显着减小代码的大小,甚至不会提高内存利用率,但是与迭代相比,它确实可以做到。

要终止递归,您必须在函数的定义中包括一个select语句,以强制函数返回而不给其自身进行递归调用。递归函数的定义中不存在select语句将使该函数一旦被调用就可以进行无限递归。

让我们用一个将返回数字阶乘的函数来理解递归。

int factorial(int num){int答案;如果(num == 1){返回1; } else {answer = factorial(num-1)* num; //递归调用} return(answer); }

在上面的代码中,其他部分的语句显示了递归,因为该语句调用了它所驻留的函数factorial()。

迭代的定义

迭代是重复执行指令集直到迭代语句中的条件变为假的过程。迭代语句包括初始化,比较,迭代语句内语句的执行以及最后控制变量的更新。更新控制变量后,将再次对其进行比较,然后过程会重复执行自身,直到迭代语句中的条件变为假。迭代语句是“ for”循环,“ while”循环,“ do-while”循环。

迭代语句不使用堆栈来存储变量。因此,与递归函数相比,迭代语句的执行更快。即使是迭代函数也没有重复函数调用的开销,这也使得其执行比递归函数更快。当控制条件为假时,终止迭代。迭代语句中缺少控制条件可能会导致无限循环,或者可能导致编译错误。

让我们了解有关上述示例的迭代。

int factorial(int num){int answer = 1; //需要初始化,因为它在初始化之前可能包含一个垃圾值(int t = 1; t> num; t ++)//迭代{answer = answer *(t);返回(答案); }}

在上面的代码中,该函数使用迭代语句返回数字的阶乘。


  1. 递归是程序中的方法重复调用自身时,而迭代是程序中的一组指令重复执行时。
  2. 递归方法包含指令集,调用自身的语句和终止条件,而迭代语句包含初始化,增量,条件,循环内的指令集和控制变量。
  3. 条件语句确定递归的终止,而控制变量的值确定迭代语句的终止。
  4. 如果该方法未导致终止条件,则进入无限递归。另一方面,如果控制变量从不导致终止值,则迭代语句将无限迭代。
  5. 无限递归会导致系统崩溃,而无限迭代会消耗CPU周期。
  6. 递归始终应用于方法,而迭代则应用于指令集。
  7. 递归过程中创建的变量存储在堆栈中,而迭代不需要堆栈。
  8. 递归导致重复的函数调用的开销,而迭代没有函数调用的开销。
  9. 由于函数调用的开销,递归的执行速度较慢,而迭代的执行速度较快。
  10. 递归减少了代码的大小,而迭代使代码更长。

结论:

递归函数易于编写,但与迭代相比,它们的性能不佳,而迭代难于编写,但与递归相比,其性能良好。