
程疗设计在线开放课程 函数 函数的调用 主讲:曾志华
函 数 ——函数的调用 在线开放课程 主讲:曾志华

递归的例子 C程设甜 ·从前有座山,山里有座庙,庙里 有个老和尚,正在给小和尚讲故 事呢!故事是什么呢?“从前有 座山,山里有座庙,庙里有个老 和尚,正在给小和尚讲故事呢! 故事是什么呢?“从前有座山, 山里有座庙,庙里有个老和尚, 正在给小和尚讲故事呢!故事是 什么呢?…
递归的例子 • 从前有座山,山里有座庙,庙里 有个老和尚,正在给小和尚讲故 事呢!故事是什么呢? “从前有 座山,山里有座庙,庙里有个老 和尚,正在给小和尚讲故事呢! 故事是什么呢? “从前有座山, 山里有座庙,庙里有个老和尚, 正在给小和尚讲故事呢!故事是 什么呢?……

递归调用的形式(1) 函数1 f1(intx,inty) {… f1(m,n); 调用函数1 }
递归调用的形式(1) 函数1 f1(int x,int y) { …… f1(m,n); 调用函数1 …… }

递归调用 递归是把一个“大问题”转化为多个“小问题”来解决, 再把这些“小问题”进一步分解成更小的“小问题”来解决, 如此分解,直至每一个“小问题”都可以直接解决, 此时分解到不能再分解为止。 关键: 寻找递归关系,它能使问题的规模变小,且变小后的问题与原 问题在本质上是一样的
递归调用 递归是把一个“大问题”转化为多个“小问题”来解决, 再把这些“小问题”进一步分解成更小的“小问题”来解决, 如此分解,直至每一个“小问题”都可以直接解决, 此时分解到不能再分解为止。 关键: 寻找递归关系,它能使问题的规模变小,且变小后的问题与原 问题在本质上是一样的

递归调用 C程原设 递归算法的执行过程分递推和回归两个阶段。 1递推阶段: 是个不断简化问题的阶段。(通过递归函数调用) 把对较复杂问题(规模为)的求解转化为比原问题简单一 些的问题(规模小于)的求解。当递推到最简单的不用再 简化的问题时,递推终止
递归调用 递归算法的执行过程分递推和回归两个阶段。 1 递推阶段: 是个不断简化问题的阶段。(通过递归函数调用) 把对较复杂问题(规模为n)的求解转化为比原问题简单一 些的问题(规模小于n)的求解。当递推到最简单的不用再 简化的问题时,递推终止

递归调用 语 程序设汁 2 回归阶段: 当获得最简单情况的解后,逐级返回,依次得到稍复杂 问题的解 再返回上层调用,不断重复,最终得到整个问题的解。 (递归函数返回)
递归调用 2 回归阶段: 当获得最简单情况的解后,逐级返回,依次得到稍复杂 问题的解 再返回上层调用,不断重复,最终得到整个问题的解。 (递归函数返回)

函数的递归调用-举例 程疡设计 有5个人在一起,探讨年龄问题。问第5个人多少岁?他说比第4个 人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人, 又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问 第1个人,他说是10岁。请问第5个人多大? age (5)=age (4)+2 age (4)=age (3)+2 age (3)=age (2)+2 age(n)=10(n=1) age (2)=age (1)+2 age (n-1)+2(n>1) age (1)=10
函数的递归调用-举例 有5个人在一起,探讨年龄问题。问第5个人多少岁?他说比第4个 人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人, 又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问 第1个人,他说是10岁。请问第5个人多大? age(5)= age (4)+2 age(4)= age (3)+2 age(3)= age (2)+2 age(2)= age (1)+2 age(1)= 10 age(n)= 10 (n=1) age(n-1)+2 (n>1)

函数的递归调用-举例 程疡设计 递归调用思路: 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问 题来求解。递归需要有递归结束条件和简化过程。 int age (int n int c; if(n==1) c=10; else c=age(n-1)+2; return c;
函数的递归调用-举例 递归调用思路: 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问 题来求解。递归需要有递归结束条件和简化过程。 int age(int n) { int c; if(n= =1) c=10; else c=age(n-1)+2; return c; }

函数的递归调用-举例 计算n的阶乘fn)= 「 1 (n=1) n*(n-1)! (n>1) 体此函数用于计算a的阶乘! int factorial(int n) if (n 0) printf(a<0,数据错误!”); else if ((n==0)II(n==1)) return 1; else nn factorial(n-1); return n;
函数的递归调用-举例 计算n的阶乘f(n) = 1 (n=1) n*(n-1)! (n>1) /* 此函数用于计算 a 的阶乘 */ int factorial(int n) { if (n < 0) printf(“a<0,数据错误!”); else if ((n==0)||(n==1)) return 1; else { n = n * factorial(n-1); return n; } }

递归求解n!的过程 语号程序设计 主程序main:fact(4 参数4计算4*fact(3) 返回24 递 结 回 数 参数3 计算3*fact(2) 返回6 传 果返 求 用 参数2计算2*fact(1 返回2 参数1计算1*fact(0) 返回1 参数0 直接定值=1 返回1
主程序 main : fact(4) 参数 4 计算 4*fact(3) 参数 2 计算 2*fact(1) 参 数 传 递 结 果 返 回 递 归 调 用 回 归 求 值 递归求解n!的过程 返回 1 返回 1 返回 2 返回 6 返回 24