1.8【问题描述】
有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限。要将这个长度为N的地板铺满,一共有多少种不同的铺法?
例如,长度为4的地面一共有如下5种铺法:
4=1+1+1+1
4=2+1+1
4=1+2+1
4=1+1+2
4=2+2
编程用递归的方法求解上述问题。
【输入】 只有一个数N,代表地板的长度
【输出】 输出一个数,代表所有不同的瓷砖铺放方法的总数
【输入范例】 4
【输出范例】 5
2.需求分析
本演示程序用VC++6.0编写,完成一个数N(1<=N<=10)由数个1和2的相加。
① 输入的形式和输入值的范围:只有一个正整数N(1<=N<=10),代表地板的长度。在所有输入中,元素的值都是整数
② 输出的形式:输出一个数,代表所有不同的瓷砖铺放方法的总数 。
③ 程序所能达到的功能:完成一个数N(1<=N<=10)由数个1和2的相加。
④ 测试数据:
【输入范例】 4
【输出范例】 5
3.概要设计
1)在稿纸上算出1-10结果,找出其规律或者算出其结果的方法。为了实现上述程序功能,需要定义递归函数来实现:
int f(int n)
{
int s;
if(n==1||n==2)s=n;
else s=f(n-1)+f(n-2);
return s;
}
2)本程序包含2个函数:
① 主函数main()
② 斐波那契数列递归函数int f(int n)
各函数间关系如下:
main() int f(int n)
4.详细设计
在稿纸上算出1-10结果,{1,1},{2,2},{3,3},{4,5},{5,8},{6,13},{7,21},{8,34},{9,55},{10,89},是斐波那契数列的前部分。即利用此数列的规律来实现。即此数列被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
#include<stdio.h>
int f(int n)
{
int s;
if(n==1||n==2)s=n;
else s=f(n-1)+f(n-2); //斐波那契数列,使用递归
return s; //输出斐波那契数列(f(1)=1)第n个数
}
void main()
{
int n;
printf("请输入n值:"); //输入地板长度
scanf("%d/n",&n);
if(n<1||n>10) //判断输入的n值是否符合要求
printf("输入的n值不在范围内!\n");
else printf("%d\n",f(n)); //符合要求即调用函数f(n)
}
5.调试分析
#include<stdio.h>
int f(int n)
{
int s;
if(n==1||n==2)s=n;
else s=f(n-1)+f(n-2);
return s; 时间复杂度为T(n)=O(1),空间复杂度为S(n)=O(1)
}
void main()
{
int n;
printf("请输入n值:");
scanf("%d/n",&n);
if(n<1||n>10)
printf("输入的n值不在范围内!\n");
else printf("%d\n",f(n));
}
调试时,先进入main()函数,然后执行输出语句来进行提示,执行输入语句,再根据判断输入的n值来执行相应的语句,要是是1就输出“输入的n值不在范围内!”,要是0即调用f(n)函数。f(n)函数是一个递归函数,根据斐波那契数列的特点来求出结果。最后返回s,回到主函数来进行输出s值。
6.使用说明
程序名为1.exe,运行环境为VC++6.0。程序执行后显示
根据提示输入n值,点击换行,下一行就输出结果。
7.测试结果
1) 建立函数:
» 输入:4
输出:5
» 输入:-9
输出:输入的n值不在范围内!