[关闭]
@SuHongjun 2020-04-23T03:38:41.000000Z 字数 1694 阅读 262

C语言-Day 15:函数的嵌套调用和递归调用

C语言 2020春季学期


函数的嵌套调用

  1. #include "stdio.h"
  2. int pf(int x)
  3. {
  4. return x*x;
  5. }
  6. int add(int x, int y)
  7. {
  8. return pf(x) + pf(y); //调用函数 pf()
  9. }
  10. main()
  11. {
  12. int a=3,b=5,c=0;
  13. c = add(a,b); //直接调用add() ,间接调用了函数 pf()
  14. printf("c=%d\n", c);
  15. }

函数的递归调用

递归调用就是一个函数自己调用自己

例1 :阶乘计算

输入n, 计算并输出 n!, 要求用用户自定义的递归函数实现

  1. #include "stdio.h"
  2. long jc(int n) //非递归函数:计算 n!
  3. {
  4. long x=1,i;
  5. for(i=1; i<=n; i++)
  6. x *= i;
  7. return x;
  8. }
  9. long jc2(int n) //递归函数:计算 n!
  10. {
  11. if(n==1) //递归结束的条件
  12. return n;
  13. else
  14. return n * jc2(n-1); //调用自己 n! = n * (n-1)!
  15. }
  16. main()
  17. {
  18. int n;
  19. printf("n=");
  20. scanf("%d", &n);
  21. printf("%d! = %d\n",n, jc(n)); //调用非递归函数
  22. printf("%d! = %d\n",n, jc2(n)); //调用递归函数
  23. }

例2:输出斐波那契数列

斐波那契数列:1,1,2,3,5,8,13,21,34,55,89,。。。。。。
非递归方式:

  1. #include "stdio.h"
  2. int fbnq_i(int i_1, int i_2) //斐波那契数列的第 i 项值
  3. {
  4. return i_1 + i_2;
  5. }
  6. main() //输出斐波那契数列: 非递归方式
  7. {
  8. int end = 1000, a=1, b=1,t;
  9. printf("斐波那契数列:\n");
  10. printf("%d\t",a);
  11. while(b <= end)
  12. {
  13. printf("%d\t",b);
  14. t = a;
  15. a = b;
  16. b = fbnq_i(t,b); //调用函数fbnq_i( ) 得到数列第i项值
  17. }
  18. printf("\n");
  19. }

斐波那契数列输出的递归实现:

  1. #include "stdio.h"
  2. int fbnq_dg(int i) //用递归方式,返回斐波那契数列的第 i 项值
  3. {
  4. if(i<=1) //递归结束的条件
  5. return 1;
  6. else
  7. return fbnq_dg(i-1) + fbnq_dg(i-2); //递归计算:斐波那契数列第i项 = 第i-1项 + 第i-2项
  8. }
  9. main() //输出斐波那契数列,采用递归方式,main()的代码更简洁易读
  10. {
  11. int end = 1000,i=0;
  12. printf("斐波那契数列:\n");
  13. while(fbnq_dg(i) < end)
  14. {
  15. printf("%d\t",fbnq_dg(i)); //调用函数fbnq_dg( ) 得到数列第i项值
  16. i++;
  17. }
  18. printf("\n");
  19. }

斐波那契数列输出的递归实现2:

  1. #include "stdio.h"
  2. int fbnq_i(int i) //计算并返回斐波那契数列中第 i 项的值
  3. {
  4. if(i<=2)
  5. return 1;
  6. else
  7. return fbnq_i(i-1) + fbnq_i(i-2);
  8. }
  9. main()
  10. {
  11. int i=1, end=1000;
  12. printf("斐波那契数列:\n");
  13. while(1)
  14. {
  15. if(fbnq_i(i)<=end)
  16. printf("%d\t", fbnq_i(i));
  17. else
  18. break;
  19. i++;
  20. }
  21. printf("\n");
  22. }

例3:n阶勒让德多项式的输出:

  1. #include "stdio.h"
  2. float lrd_n(int n,float x) //递归计算n阶勒让德多项式的第 i 项的值
  3. {
  4. float result;
  5. if(n==0)
  6. return 1;
  7. else if(n==1)
  8. return x;
  9. else
  10. {
  11. result = 1.0*((2*n-1)*x*lrd_n(n-1) - (n-1)*lrd_n(n-2))/n;
  12. return result;
  13. }
  14. }
  15. main()
  16. {
  17. //作业:请补充完善
  18. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注