【C | recursion】recursion(递归) && recursion call

80 阅读3分钟

Sat 8.31.2024

递归

引例

从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'" C 递归 | 菜鸟教程

image.png

“ 递归的强大之处在于它允许用户用有限的语句描述无限的对象。因此,在计算机科学中,递归可以被用来描述无限步的运算,尽管描述运算的程序是有限的。 ”

——尼克劳斯·维尔特

定义

(直接或者间接)调用函数自身,称为递归函数。 此项技术:递归.

在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环。

主要思想

大事化小

语法格式

how does recursion work?

void recursion(){
    ...
    recursion();
    ...
}
int main(){
    ...
    recursion()
    ...
    return 0;
}

图解

递归图解.png

流程图

image.png

image.png

【 limited conditions 】限制条件

  • 需设置一个明确的终止条件
  • 递归函数,本身是大事化小,越递推,数据规模肯定越小

【nature】本质

  • 使用数据结构---栈原理
    • “先进后出”

comparison】比较 递推&&循环

  • 循环问题可以使用递归思想解决
  • 递归问题未必都可以使用循环解决

代码优雅:递归结构简单,易理解,但存储空间大,时间复杂度旺旺旺在指数级别,运行速度慢

运行较快: 循环结构较为复杂,存储空间较小

【application scene】 应用场景

递归的基本思想

将一个问题分解成规模更小的同类问题来解决,当问题的规模小到一定程度时,就可以直接给出解答,这个解答称为递归的基准情形(base case)。

递归的关键在于定义递归函数时,需要明确基准情形以及如何将问题分解成更小的问题。

案例

  • 自然数求和(1-100)
  • n!阶乘问题
  • 顺序打印某一自然数/整数的每位数字
  • 斐波那契数列(Fibonacci sequence)
  • 汉诺塔问题 (Towers of Hanoi)
  • 树的遍历

【自然数求和】1-100之和

常用方法:

  • 非递归
    • 循环解决

解析 【C | recursion】☞ 递归 之 自然数求和☞ 【自然数求和】1-100之和

【阶乘问题 】 n!

基准情形是0! = 1

解析 【C | recursion 】 【阶乘问题】n!阶乘 【阶乘】n!

 if (n < 0) return -1; //

【digit】顺序打印某一自然数/整数的每位数字

解析 【C | recursion】 用 C 语言实现顺序打印某一自然数/整数的每位数字

【Fibonacci 】斐波那契数列(Fibonacci sequence)

解析

【Hanoi】汉诺塔问题 (Towers of Hanoi)

解析

【Tree】树的遍历

解析