零基础C语言:第十四讲(递归、汉诺塔)

252 阅读2分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

递归

  • 汉诺塔、谢尔宾斯基三角形、目录树的索引等例子

  • 简单递归

    • 举例
    • 结果
  • 注意:递归必须要有结束条件,否则程序将崩溃。

  • 递归求阶乘

    • 方法一:使用循环for

      • 举例
      • 结果
    • 方法二:使用递归

      • 举例
      • 结果
      • 注意

        • 注意使用if条件语句而不是while循环语句(while是语句结束之后还会进行判断,此时就会出现无限循环)
        • num-1和--num使用环境不同,在上面的代码中如果使用--num则结果为0,是因为--num在局部变量存储的位置将num减1,操作栈将第一次的值减1之后压入栈中,使得栈中的值为00123。当使用num-1时栈中的值为01234。
  • 实现递归要满足的两个基本条件

    • 调用函数本身
    • 设置正确的结束条件
  • 慎用递归:通常使用迭代,但在有些地方使用递归更为简便(如汉诺塔)

汉诺塔

  • 汉诺塔

    • 求解分析

      • 简单的分解为三个步骤:

        • 将前63个盘子从X移动到Y上
        • 将最底下的第64个盘子从X移动到Z上
        • 将Y上的63个盘子移动到Z上
      • 问题1:将X上的63个盘子借助Z移动到Y上

        • 拆解为三个步骤:

          • 将前62个盘子从X移动到Z上
          • 将最底下的第63个盘子从X移动到Y上
          • 将Z上的62个盘子移动到Y上
      • 问题2:将Y上的63个盘子借助X移动到Z上

        • 拆解为三个步骤:

          • 将前62个盘子从Y移动到X上
          • 将最底下的第63个盘子从Y移动到Z上
          • 将X上的62个盘子移动到Z上
    • 代码(注意形式参数和实参)
    • 结果