当前位置:文档之家› 3.2.8递归函数程序设计 - 递归函数程序设计_实验项目

3.2.8递归函数程序设计 - 递归函数程序设计_实验项目

实验项目一
1.实验名称:求斐波那契数列项
2.实验目的:
(1)熟练掌握递归函数的定义、实现与调用方法。

(2)熟练掌握循环与分支结构。

3.实验任务
(1)实验内容:编写求斐波那契数列项的函数,返回值为第n项值。

斐波那契数列的定义为:
f(0)=0,f(1)=1
f(n)=f(n-2)+f(n-1) (n>1)
(2)实验要求:输入正整数n,输出斐波那契数列前n项,每行5个。

要求用递归方法,并写出相应的主函数。

测试案例:
4.实验分析
(1)问题分析:问题的定义本身就是一个递归表示法:
递归出口:f(0)=0,f(1)=1
递归公式:f(n)=f(n-2)+f(n-1) (n>1)
有了这2个关键点,程序变得简单。

(2)实现要点:用函数fib(n)表示第n项斐波那契数列值,主函数循环调用fib(i),便可产生斐波那契数列前n项。

5.实验思考题
请比较递推法和递归法实现的不同。

实验项目二
1.实验名称:将正整数n转换为二进制
2.实验目的:
(1)熟练掌握递归思想。

(2)熟练掌握递归函数的定义、实现与调用方法。

3.实验任务
(1)实验内容:输入1 个正整数n,将其转换为二进制后输出。

(2)实验要求:要求定义并调用函数 dectobin(n),它的功能是输出 n 的二进制。

测试案例:
4.实验分析
(1)问题分析:首先应了解手工计算的过程。

通过不断整除2得到余数,直到商为零为止,将得到的余数系列逆序输出,即为转换的二进制数。

(2)实现要点:对于递归程序设计的2个关键点:
递归式:不断除2,输出余数
递归出口:商为0
余数系列逆序输出解决方法:先递归调用,再输出,dectobin(n)= dectobin(n/2)+输出(n %2)。

由于是先递归,再输出,因此递归会不断深入直到出口为止,然后返回回来后才能输出,达到了逆序的目的。

5.实验思考题
如何将本例推广到任意进制数的转换输出。

实验项目三
改正下列程序中的错误,输入一个整数n (n 0)和一个双精度浮点数x,输出函数P(n,x)的值(保留2位小数)。

1 (n=0)
P(n, x) = x (n=1)
((2n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n (n>1)
输入输出示例
Enter n, x: 10 1.7
P(10,1.70) = 3.05
源程序(有错误的程序)
#include <stdio.h>
int main(void)
{
int n;
double x, result;
printf(“Enter n, x: ”);
scanf("%d%lf", &n, &x);
result = p(n,x);
printf("P(%d,%.2lf) = %.2lf\n", n, x, result);
return 0;
}
double p(int n, double x)
{
p(n,x) = ((2 * n - 1) * p(n - 1,x) - (n - 1) * p(n - 2,x)) / n;
return p(n,x);
}
编译错误汇总:
错误行号: 正确语句:
错误行号: 正确语句:
错误行号: 正确语句:
错误行号: 正确语句:
1.改正上述编译错误后,再次编译连接后无错误出现,运行程序:
运行输入测试数据为 10 1.7,运行结果为: ,是否正确:2.请仔细分析错误产生的原因,模仿调试事例中方法进行调试改错。

并简要说明你的方法并给出正确语句:
方法:
改错汇总:
错误行号: 正确语句:
错误行号: 正确语句:
错误行号: 正确语句:
错误行号: 正确语句:
错误行号: 正确语句:。

相关主题