实验六 递归调用
一、 实验目的
- 了解递归的基本概念;
- 了解递归调用的实现原理;(课本P153)
- 了解递归算法的设计;
- 利用循环或栈将递归算法转换成非递归算法。
二、 实验环境
Windows XP以上版本的操作系统,Visual Studio 2010编程环境。
三、 实验内容和步骤
验证题:
- 利用递归函数,求正整数n的阶乘:
fac(n) = n * (n-1) * (n-2) * …… * 2 * 1
#include <iostream>
using namespace std;
// 本程序用递归算法求n的阶乘
int counter = 0;
int fac(int n)
{
counter++; // 断点
cout << "第" << counter << "次调用:n=" << n << endl;
if (n == 0 || n == 1)
return 1;
else
return n * fac(n - 1);
}
int main()
{
cout << "结果:fac(5)=" << fac(5) << endl;
return 0;
}
运行程序,理解递归调用的过程。
在断点处设置断点,查看每次递归调用时 counter 和 n 的值。
同时,观察系统栈的变化过程,加深对递归调用的理解:
2. 汉诺塔问题
根据大课课件,完成汉诺塔问题的完整程序,并设定盘子的数目分别为3和6,调试程序,理解程序的执行过程。动画演示:
https://fiddle.jshell.net/timwzw/S7mYF/show/
http://www.hannuota.cn/
#include <iostream>
using namespace std;
void Hanoi(int n, char X, char Y, char Z)
{
if (n == 1)
cout << X << "->" << Z << "\t";
else {
Hanoi(n - 1, X, Z, Y);
cout << X << "->" << Z << "\t";
Hanoi(n - 1, Y, X, Z);
}
}
int main()
{
Hanoi(3, 'A', 'B', 'C');
cout << endl;
return 0;
}
四、 设计题
- 请使用循环结构,将n的阶乘的递归算法转换成非递归算法。
#include <iostream>
using namespace std;
// 本程序用非递归算法求n的阶乘
int fac_non_recursive(int n)
{
int result = 1;
for (int i = n; i > 1; i--)
result *= i;
return result;
}
int main()
{
cout << "5的阶乘是:" << fac_non_recursive(5) << endl;
return 0;
}
- 已知 A[n] 为整数数组,编写一个递归算法求 n 个元素的平均值。
提示: Avg(n) = ( Avg(n-1) * (n-1) + A[n-1] ) / n
#include <iostream>
using namespace std;
// 本程序用递归算法求整数数组A的平均值
//int A[] = {1, 2, 3, 4, 5};
int A[] = {3, 9, 6, 5, 4};
double Avg(int n) // 注意返回值类型为double,因为在递归过程中平均值可能为小数。
{
if (n == 1) // 递归的结束条件
return A[0];
else
return (Avg(n - 1) * (n - 1) + A[n - 1]) / n;
}
int main()
{
cout << "数组A的平均值是:" << Avg(5) << endl;
return 0;
}