【项目任务】
求出数组元素中最大的一个。
【设计思路】
利用递推公式:Max(x1,x2…xn)=Max(Max(x1,x2…x(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.本程序使用数组名作为参数,注意使用格式。
【项目任务】
用递归方法求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!这个复杂的问题逐步简单化。
【项目任务】
这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C。开始时,A座上有64个盘子,盘子大小不等,大盘在下,小盘在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘子,且在移动过程中,3个座上都要保持大盘在下,小盘在上,可以利用B座。要求编程打印出移动的步骤。
【设计思路】
可以定义一个函数hanoi(n,a,b,c),其功能是:将N个盘子从A座上借助B座移动到C座上。这样,移动N个盘子的工作就可以按照以下步骤进行:
(1)hanoi(n-1,a,c,b)。
(2)将一个盘子从a移动到b上。
(3)hanoi(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
【知识拓展】
如果盘子数多一些,本题就是一个非常复杂的问题。而通过递推的思想大胆假设,可以将复杂问题简单化,再运用程序来实现这种假设,解决了汉诺塔问题。