定义:

递归函数就是在函数体内调用本函数;
递归函数的使用要注意函数终止条件避免死循环;

递归实现形式:

1.声明一个具名函数,通过函数名调用

  1. function f(a){
  2. if(a<=1){
  3. return 1
  4. }else{
  5. return a*f(a-1)
  6. }
  7. }

但是这样使用会因为 函数名 f 的变化而报错,

  1. f = null
  2. f () // Uncaught TypeError: f is not a function
  1. 使用arguments.callee代替函数名
    在严格模式下不支持使用arguments.callee
    3.使用函数表达式
    1. var fun = (function f(a){
    2. if(a<=1){
    3. return 1
    4. }else{
    5. return a*f(a-1)
    6. }
    7. })
    8. // 或:
    9. var f = function (a){
    10. if(a<=1){
    11. return 1
    12. }else{
    13. return a*f(a-1)
    14. }
    15. }
    16. var fun = f;

    递归返回值

    1.递归函数相当于一种循环调用,需要避免死循环,给定一个条件停止调用
    2.递归函数的返回值要返回整个函
    1. // 返回公约数的数组集合
    2. let fun = (function f(a,n = 1,b=[]){
    3. if(a%n === 0) {
    4. b.push(n)
    5. }
    6. n ++;
    7. if(n>a){
    8. return b
    9. }
    10. return f(a,n,b) // *** 要返回整个函数,不能只是return b
    11. })
    12. 调用函数
    13. fun(4)
    14. [1, 2, 4]
    * 处要返回整个函数,
    这是因为当执行条件 n>a 不成立时是没有返回值的,例如,第一次执行时 n=1,a=4,1>4 为false因而没有返回值,接着之后的值也都没有返回
    1. // 可以参考这种形式,有return fun
    2. fun (){
    3. return fun(){
    4. return fun(){
    5. return 4
    6. }
    7. }
    8. }
    9. // 可以参考这种形式,没有return fun
    10. fun (){
    11. fun(){
    12. fun(){
    13. return 4
    14. }
    15. }
    16. }