没有合适的资源?快使用搜索试试~ 我知道了~
递归与广义表
资源详情
资源评论
资源推荐
第 5 章 递归与广义表
第 5 章 递归与广义表
5-1 已知 A[n]为整数数组,试写出实现下列运算的递归算法:
(1) 求数组 A 中的最大整数。
(2) 求 n 个整数的和。
(3) 求 n 个整数的平均值。
【解答】
#include <iostream.h>
class RecurveArray { //数组类声明
private:
int *Elements; //数组指针
int ArraySize; //数组尺寸
int CurrentSize; //当前已有数组元素个数
public :
RecurveArray ( int MaxSize =10 ) :
ArraySize ( MaxSize ), Elements ( new int[MaxSize] ){ }
~RecurveArray ( ) { delete [ ] Elements; }
void InputArray(); //输入数组的内容
int MaxKey ( int n ); //求最大值
int Sum ( int n ); //求数组元素之和
float Average ( int n ); //求数组元素的平均值
};
void RecurveArray :: InputArray ( ){ //输入数组的内容
cout << "Input the number of Array: ";
for ( int i = 0; i < ArraySize; i++ ) cin >> Elements[i];
}
int RecurveArray :: MaxKey ( int n ) { //递归求最大值
if ( n == 1 ) return Elements[0];
int temp = MaxKey ( n - 1 );
if ( Elements[n-1] > temp ) return Elements[n-1];
else return temp;
}
int RecurveArray :: Sum ( int n ) { //递归求数组之和
if ( n == 1) return Elements[0];
else return Elements[n-1] + Sum (n-1);
53
第 5 章 递归与广义表
}
float RecurveArray :: Average ( int n ) { //递归求数组的平均值
if ( n == 1) return (float) Elements[0];
else return ( (float) Elements[n-1] + ( n - 1) * Average ( n - 1 ) ) / n;
}
int main ( int argc, char* argv [ ] ) {
int size = -1;
cout << "No. of the Elements : ";
while ( size < 1 ) cin >> size;
RecurveArray ra ( size );
ra.InputArray();
cout<< "\nThe max is: " << ra.MaxKey ( ra.MaxSize ) << endl;
cout<< "\nThe sum is: " << ra.Sum ( ra.MaxSize ) << endl;
cout<< "\nthe avr is: " << ra.Average ( ra.MaxSize ) << endl;
return 0;
}
5-2 已知 Ackerman 函数定义如下:
(1) 根据定义,写出它的递归求解算法;
(2) 利用栈,写出它的非递归求解算法。
【解答】
(1) 已知函数本身是递归定义的,所以可以用递归算法来解决:
unsigned akm ( unsigned m, unsigned n ) {
if ( m == 0 ) return n+1; // m == 0
else if ( n == 0 ) return akm ( m-1, 1 ); // m > 0, n == 0
else return akm ( m-1, akm ( m, n-1 ) ); // m > 0, n > 0
}
(2) 为了将递归算法改成非递归算法,首先改写原来的递归算法,将递归语句从
结构中独立出来:
unsigned akm ( unsigned m, unsigned n ) {
unsigned v;
if ( m == 0 ) return n+1; // m == 0
if ( n == 0 ) return akm ( m-1, 1 ); // m > 0, n ==0
v = akm ( m, n-1 ) ); // m > 0, n > 0
54
第 5 章 递归与广义表
return akm ( m-1, v );
}
计算 akm(2, 1)的递归调用树如图所示:
用到一个栈记忆每次递归调用时的实参值,每个结点两个域{vm, vn}。对以上实例,
栈的变化如下:
相应算法如下
#include <iostream.h>
#include “stack.h”
#define maxSize 3500;
unsigned akm ( unsigned m, unsigned n ) {
struct node { unsigned vm, vn; }
stack<node> st ( maxSize ); node w; unsigned v;
w.vm = m; w.vn = n; st.Push (w);
do {
55
akm(2, 1)
v =akm(2, 0)
akm(1, 1)
v =akm(1, 0)
akm(0, 1) = 2
akm(0, 2) =
3
akm(1, 3)
v = akm(1, 2)
v = akm(1, 1)
v = akm(1, 0)
akm(0, 1) = 2
akm(0, 2) = 3
akm(0, 3) = 4
akm(0, 4) = 5
v = 2
v = 2
v = 3
v = 4
v = 3
akm = 5
akm = 5
akm = 3
2 1 2 1 2 1 2 1 2 1 1 3
2 0 1 1 1 1 1 1 0 2
1 0 0 1
改 akm(m-1,1) 改 akm(m-1,1) v = n+1= 2 改 akm(m-1,v) 改 akm(m-1,v)
v = n+1 = 3
vm vn vm vn vm vn vm vn vm vn vm vn
vm vn vm vn vm vn vm vn vm vn vm vn
1 3 1 3 1 3 1 3 0 4
1 2 1 2 1 2 0 3
1 1 1 1 0 2
1 0 0 1
改 akm(m-1,1) v = n+1 = 2 改 akm(m-1,v) 改 akm(m-1,v) 改 akm(m-1,v) 栈空, 返回 v = 5
v = n+1 = 3 v = n+1 = 4 v = n+1 = 5
剩余12页未读,继续阅读
lhh5356
- 粉丝: 0
- 资源: 40
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0