您的位置: 网站首页 > 程序开发 > C语言程序设计案例教程 > 第七章 函数程序设计 > 【7.3 函数的嵌套与递归案例】

7.3 函数的嵌套与递归案例

 

7.3  函数的嵌套与递归案例

案例7.4  求最大值

【项目任务】

求出数组元素中最大的一个。

【设计思路】

利用递推公式:Max(x1,x2xn)=Max(Max(x1,x2x(n-1)),xn),设计函数max( ),实现递归调用。

【程序代码】

#include<stdio.h>

int max(int x[],int head,int tail)

{

    int temp;

 

    if(tail==head)

        return x[head];

    else

    {

        temp=max(x,head,tail-1);

    if (temp>x[tail])

        return temp;

    else  return x[tail];

    }

}

main()

{

    int number[5],i;

   

    printf("please input 5 numbers:\n");

    for(i=0;i<5;i++)

       scanf("%d",&number[i]);

    printf("The max number of the 5 numbers is %d",max(number,0,4));

}

【运行结果】

please input 5 numbers:

9  0  7  2  4

The max number of the 5 numbers is 9

【知识拓展】

1.在函数中,调用自身的现象称为递归调用,这是C语言的特色之一。函数的递归调用对应数学中的递推公式。只有找到问题内部的递推关系,才能将现有问题简单化,找到用于递归调用的理论基础。

2.递归的函数必须是有限次的、有终止的,所以一般用if语句来控制,只有在某一条件成立时才继续执行递归调用,否则不再继续。

3.本程序使用数组名作为参数,注意使用格式。

案例7.5  求阶乘

【项目任务】

用递归方法求n!

【设计思路】

例如5!=4!5,而4!=3!4,依此类推,1!=1。可用下列递归公式表示:

n!=(n-1)!n

【程序代码】

#include <stdio.h>

float fac(int n)

{

    float f;

 

    if(n<0) 

        printf("n<0,dataerror!");

    else if(n==0||n==1)

        f=1;

    else f=fac(n-1)*n;

    return(f);

}

main()

{

    int n;

    float y;

 

    printf("Input an integer number:");

    scanf("%d",&n);

    y=fac(n);

    printf("%d!=%.0f\n",n,y);

}

【运行结果】

Input an integer number:5

5!=120

【知识拓展】

本例同样通过简单的递推公式,将计算n!这个复杂的问题逐步简单化。

案例7.6  汉诺塔

【项目任务】

这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座ABC。开始时,A座上有64个盘子,盘子大小不等,大盘在下,小盘在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘子,且在移动过程中,3个座上都要保持大盘在下,小盘在上,可以利用B座。要求编程打印出移动的步骤。

【设计思路】

可以定义一个函数hanoi(n,a,b,c),其功能是:将N个盘子从A座上借助B座移动到C座上。这样,移动N个盘子的工作就可以按照以下步骤进行:

1hanoi(n-1,a,c,b)

2)将一个盘子从a移动到b上。

3hanoi(n-1,c,b,a)

重复以上过程,直到将全部盘子移动到位为止。

【程序代码】

#include <stdio.h>

void move(char x,char y)

{

    printf("%c-->%c\n",x,y);

}

void hanoi(int n,char one,char two,char three)

{

    if(n==1) move(one,three);

    else

    {

        hanoi(n-1,one,three,two);

        move(one,three);

        hanoi(n-1,two,one,three);

    }

}

main()

{

    int m;

 

    printf("Input the number of diskes:");

    scanf("%d",&m);

    printf("The step to moving %d diskes:\n",m);

    hanoi(m,'A','B','C');

}

【运行结果】

Input the number of diskes:3

The step to moving 3 diskes:

A-->C

A-->B

C-->B

A-->C

B-->A

B-->C

A-->C

【知识拓展】

如果盘子数多一些,本题就是一个非常复杂的问题。而通过递推的思想大胆假设,可以将复杂问题简单化,再运用程序来实现这种假设,解决了汉诺塔问题。