《C语言程序设计教程(第二版)》第6章函数和预处理.pptVIP

  • 0
  • 0
  • 约1.41万字
  • 约 10页
  • 2022-12-05 发布于江苏
  • 举报

《C语言程序设计教程(第二版)》第6章函数和预处理.ppt

6.2 函数的调用 6.2.5 函数的嵌套调用 【例6.10】 用牛顿迭代法求一个正实数的平方根。 1)算法 (1)设置猜测值初值 (2)如果|猜测值*猜测值-x| 一极小值,则转(4) (3)置新猜测值为(x/猜测值+猜测值)/2,返回(2) (4)猜测值就是满足精度要求的x的平方根。 6.2 函数的调用 6.2.5 函数的嵌套调用 【例6.10】 用牛顿迭代法求一个正实数的平方根。 2)程序 float sqrt_x(float x),abs_x(float x); /*函数类型说明*/ main() { float a; printf(Input a=); scanf(%f,a); if(a0) printf(Input error!\n); else printf(sqrt (%f)=%f\n, a, sqrt_x(a)); } 6.2 函数的调用 float sqrt_x(float x) /*用牛顿迭代法求x的平方根*/ { float epsilon=1e-5, guess=1.0; while(abs_x(guess * guess-x)=epsilon) guess = (x/guess+guess)/2.0; return(guess); } float abs_x(float x) /*求x的绝对值*/ { if (x0) x = -x; return(x); } 【例6.10】 用牛顿迭代法求一个正实数的平方根。 3)程序运行结果 Input a=2.0CR sqrt(2.000000)=1.414216 6.2 函数的调用 6.2.6 函数的递归调用 在定义一个函数的过程中直接或间接地调用该函数本身,称为函数的递归调用。 在编制递归函数时应注意:每个递归过程都要有一个“出口”,函数的变化趋势应不断靠近出口,即必须有一个结束递归过程的条件。当条件成立时终止递归过程,并使程序控制逐层从函数中返回。 6.2 函数的调用 6.2.6 函数的递归调用 【例6.11】 用递归函数计算 n!= 1 n=0 n*(n-1)! n0 按照这个公式,可将求n!的问题变成求(n-1)!的问题,而求(n-1)!的问题又可以变成求(n-2)!的问题,……直到n=0。因为0!=1。因此可以写出如下递归函数: long recur(int n) { if(n==0) return(1); else return(n*recur(n-1)); } 6.2 函数的调用 6.2.6 函数的递归调用 程序运行结果如下: 0!=1 1!=1 2!=2 3!=6 recur(3) 第一次调用 n=3 3* recur(2) 返回值6 第二次调用 n=2 2* recur(1) 返回值2 第三次调用 n=1 1* recur(0) 返回值1 第四次调用 n=0 0!=1 返回值1 【例6.11】 用递归函数计算n!。 用这个函数计算3!的递归调用的执行情况 main() { long recur(); int i; for (i = 0;i=3;i++) printf(%d!=%ld\n, i, recur(i)); } 6.2 函数的调用 6.2.6 函数的递归调用 recur(3) 第一次调用 n=3 3* recur(2) 返回值6 第二次调用 n=2 2* recur(1) 返回值2 第三次调用 n=1 1* recur(0) 返回值1 第四次调用 n=0 0!=1 返回值1 【例6.11】 用递归函数计算n!。 用这个函数计算3!的递归调用的执行情况 6.2 函数的调用 6.2.6 函数的递归调用 在编制递归函数时应注意:每个递归过程都要有一个“出口”,函数的变化趋势应不断靠近出口,即必须有一个结束递归过程的条件。当条件成立时终止递归过程,并使程序控制逐层从函数中返回。例如,0!=1,就是使递归结束的条件。 递归算法通常是把规模较大、较难解决的问题变成规模较小、较易解决的问题。规模小的问题又变成规模更小的问题,并且小到直接得到它的解,从而得到原来问题的解。 6.2 函数的调用 【例6.13】 汉诺塔游戏。 游戏的装置是三根针A、B、C,A针上从小到大放有64个盘子,游戏目标是把这64个盘子从A针移到C针,规则是一次只能移动一个盘子,并且在移动过程中在三根针上都保持大盘在下

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档