递归和迭代这个两个词对于学计算机的uu们一定不陌生,在算法的学习中也经常会遇到递归算法和迭代算法,二者容易混淆,那区别又是什么呢?关于递归和迭代的理解,我也遇到过类似的面试题,接下来我们学习了解一下递归和迭代吧。
🎯关于递归和迭代
⏬递归
- 程序调用自身的编程技巧称为递归。递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。(来自百度百科——递归)
- 简单来说:递归就是一种函数调用自身的操作(就是在运行的过程中调用自己)。递归被用于处理包含有更小的子问题的一类问题。一个递归函数可以接受两个输入参数:一个最终状态(终止递归)或一个递归状态(继续递归)。
🚩关于递归的一些例子
首先我们要知道构成递归需具备的条件:
1️⃣ 子问题须与原始问题为同样的事,且更为简单;
2️⃣ 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
- 斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...
这个数列从第3项开始,每一项都等于前两项之和。
functionfibonacci(n){ if(n==1||n==2) return1returnfibonacci(n-1) +fibonacci(n-2) }
- 阶乘 任何大于等于1 的自然数n 阶乘表示方法: n! = 1 × 2 × 3 × ... × ( n-1 ) × n
functionfactorial(n) { if (n==1) { returnn } returnn*factorial(n-1) } letfac=factorial(5) console.log(fac)
- 梵塔问题(汉诺塔问题)
已知有三根针分别用A, B, C表示,在A中从上到下依次放n个从小到大的盘子,现要求把所有的盘子从A针全部移到B针,移动规则是:可以使用C临时存放盘子,每次只能移动一块盘子,而且每根针上不能出现大盘压小盘,找出移动次数最小的方案。
- 德罗斯特效应是递归的一种视觉形式
⏬迭代
- 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
- 重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。例如利用迭代法*求某一数学问题的解。
- 对计算机特定程序中需要反复执行的子程序*(一组指令),进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。(来自百度百科——迭代)
🚩关于迭代的一些例子
- 斐波那契数列
functionfibonacci(n){ varres1=1; varres2=1; varsum=res2; for(leti=2;i<n;i++){ sum=res1+res2; res1=res2; res2=sum; } returnsum; }
- 阶乘
functionfactorial(number){ lettotal=1for (letn=number;n>1;n--){ total=total*n } returntotal} console.log(factorial(5))
- 等等
🎯关于递归和迭代的区别
简单来说
- 递归代码简洁,处理复杂问题时易于理解,但效率低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
- 迭代的效率高(因为运行循环总比反复调用函数的开销少很多),但是处理复杂问题时,代码结构复杂且不易于理解。不同于递归,可以避免出现栈溢出问题。