函数的嵌套调用与递归(初学者)

1、函数的嵌套调用

嵌套定义是在定义一个函数时,其函数体内又包含另一个函数的完整定义。

然而,C语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。

例:

main()

{

  a();

}

a()

{

  b();

}

b()

{

  return;

}

例题:计算s=2²!+3²!

思路:(1)可编写两个函数,一个是用来计算平方值的函数square,另一个是用来计算阶乘值的函数factorial。

(2)主函数先调square计算出平方值,再在square中以平方值为实参,调用factorial函数计算其阶乘值,再返回主函数,在循环程序中计算累加和。

#include <stdafx.h>
#include<stdio.h>

long square(int p);
long factorial(int q);
void main()
{
    int i;
    long s=0;
    for(i=2;i<=3;i++)
    {
        s=s+square(i);
    }
    printf("%ld\n",s);
}
long square(int p)
{
    int k;
    long r;
    k=p*p;
    r=factorial(k);
    return (r);
}

long factorial(int q)
{
    long c=1;
    int i;
    for(i=1;i<=q;i++)
    {
        c*=i;
    }
    return c;
}

2、递归

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。

例:int flint (x)

  {

    int y,z;

    z=flint(y);

    return (2*z);

  }

注:递归函数必须要有一个退出条件!

例:用递归的方法求n!

思路:求n!也可用递归的方法,即5!=4!*5,4!=3!*4……可用如下递归公式表示:

n=1  (n=0,1)

n*(n-1)!  (n>1)

#include <stdafx.h>
#include<stdio.h>

long recusion(int n);
void main()
{
    int n;
    long result;
    printf("input a integer number:\n");
    scanf("%d",&n);
    result=recusion(n);
    printf("%d!=%ld\n",n,result);
}

long recusion(int n)
{
    long tomp_result;
    if(n<0)
    {
        printf("n<0,input error!\n");
    }
    else if(n==0||n==1)
    {
        tomp_result=1;
    }
    else
    {
        tomp_result=n*recusion(n-1);
    }
    return tomp_result;
}

注:递归算法是效率低下的算法,但有些问题却只能用递归算法才能实现。如:Hanoi塔问题。

猜你喜欢

转载自www.cnblogs.com/lvfengkun/p/10344370.html