算法图解系列之递归[03]

3 递归

3.1 递归<函数>

// MARK: 3.1 递归
/*
 阶乘
 */
func factorial(_ parameter: Int) -> Int {
    // 基线条件
    guard parameter > 1 else {
        print("Base Case \(parameter)")
        return parameter
    }
    print(parameter)
    // 递归条件
   return parameter * factorial(parameter - 1)
}

print("Final result is : \(factorial(3))")

3.2 基线条件和递归条件

// MARK: - 3.2 基线条件和递归条件
// FIXME: 1. 递归条件是指函数调用自己.
// FIXME: 2. 基线条件则是指函数不再调用自己, 从而避免形成无限循环.

// MARK: - 3.3.1 栈<调用栈>
// FIXME: 栈: 是一种简单的数据结构.
// FIXME: e.g.
func greet(_ name: String) -> Void {
    // 2. 为hello函数分配内存并压入栈
    hello(name)
    // 3. hello执行完成, 将hello函数从栈中弹出, 并释放内存
    // 4. 为bye函数分配内存并压入栈
    bye(name)
    // 5. bye函数执行完成, 将hello函数从栈中弹出(移除), 并释放内存
}

private func hello(_ name: String) {
    print("Hello \(name)!")
}

private func bye(_ name: String) {
    print("bye, \(name)~")
}

// 1. 此时为greet函数分配内存并压入调用栈, 并加参数'Jim"存储到内存中
greet("Jim")
// 6. greet函数执行完成, 将其从栈中弹出, 并释放

3.3 递归调用栈

// MARK: - 3.3.2 递归调用栈
// TODO: 本小节, 拿3.1中的 factorial 函数说明
// FIXME: 1. 当调用  factorial(3)时, 此时的函数调用栈

/*
 内部执行顺序如下:
 factorial(3)
 3 * factorial(2)
 3 * (2 * factorial(1))
 3 * (2 * 1)
 3 * 2
 6
 
 // FIXME: 上述过程的长度可以看做是内存的峰值曲线.
 
 解释: 调用3时, 3内调用2, 3等待2完成; 2内调用1, 2等待1完成; 1内调用0,    1等待0完成. 当调用到0时, 0满足了基线条件, 此时 factorial(0)执行完成, 从栈中弹出, 并释放内存; 接着 factorial(1)的执行完成, 从栈中弹出并释放内存; 接着依次类推到栈底 factorial(3)的执行完成, 从栈中弹出并释放内存.
 */

// FIXME: PS: 当使用递归时, 每一次递归都栈都需要分配内存, 如果调用栈过长或无限循环,  将占用大量的内存或内存不够的情况.

// TODO: 如果遇到上述情景, 你有两种选择. 1) 重写代码, 转而使用循环. 2) 使用尾递归<这是一个高级递归, 内存的使用是恒量的, 但是部分语言不支持尾递归优化, C 可以.>.
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 计算机科学的新学生通常难以理解递归程序设计的概念。递归思想之所以困难,原因在于它非常像是循环推理(circular...
    启明_b56f阅读 7,690评论 0 20
  • 前言 几个月之前就想写这样一篇文章分享给大家,由于自己有心而力不足,没有把真正的学到的东西沉淀下来,所以一直在不断...
    小鹿动画学编程阅读 1,776评论 2 14
  • 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大奖:点击这里领取 在...
    HetfieldJoe阅读 1,890评论 0 14
  • 一、递归定义 如果函数中包含了对其自身的调用,该函数就是递归的; 递归(Recursion),在数学与计算机科学中...
    惑也阅读 11,303评论 0 4
  • 不是每一个夜晚都适合看散文,品读那样清淡的文字,体悟来自灵魂的叹息。 也许看散文需要一杯茶,或者咖啡️。需要不明不...
    咖啡遇茶阅读 609评论 19 11

友情链接更多精彩内容