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: /n";
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);
}
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-5 已知f爲單鏈表的表頭指針, 鏈表中存儲的都是整型數據,試寫出實現下列運算的遞歸算法:
(1) 求鏈表中的最大整數。
(2) 求鏈表的結點個數。
(3) 求所有整數的平均值。
【解答】
#include <iostream.h> //定義在頭文件"RecurveList.h"中
class List;
class ListNode { //鏈表結點類
friend class List;
private:
int data; //結點數據
ListNode *link; //結點指針
ListNode ( const int item ) : data(item), link(NULL) { } //構造函數
};
class List { //鏈表類
private:
ListNode *first, current;
int Max ( ListNode *f );
int Num ( ListNode *f );
float Avg ( ListNode *f, int& n );
public:
List ( ) : first(NULL), current (NULL) { } //構造函數
~List ( ){ } //析構函數
ListNode* NewNode ( const int item ); //創建鏈表結點, 其值爲item
void NewList ( const int retvalue ); //建立鏈表, 以輸入retvalue結束
void PrintList ( ); //輸出鏈表所有結點數據
int GetMax ( ) { return Max ( first ); } //求鏈表所有數據的最大值
int GetNum ( ) { return Num ( first ); } //求鏈表中數據個數
float GetAvg ( ) { return Avg ( first ); } //求鏈表所有數據的平均值
};
ListNode* List :: NewNode ( const int item ) { //創建新鏈表結點
ListNode *newnode = new ListNode (item);
return newnode;
}
void List :: NewList ( const int retvalue ) { //建立鏈表, 以輸入retvalue結束
first = NULL; int value; ListNode *q;
cout << "Input your data:/n"; //提示
cin >> value; //輸入
while ( value != retvalue ) { //輸入有效
q