前回授業の、sum(),max(),mean(),find() のループ版や、再帰版のプログラム例
// 合計ループ版
int sum( struct List* p ) {
int s = 0 ;
for( ; p != NULL ; p = p->next )
s += p->data ;
return s ;
}
// 合計再帰版
int sum( struct List* p ) {
if ( p == NULL )
return 0 ;
else
return p->data + sum( p->next ) ; // 場所のデータと以降の合計
}
// 最大値ループ版
int max( struct List* p ) {
if ( p == NULL ) {
return 0 ;
} else {
int m = p ->data ; // 先頭を仮の最大値
for( p = p->next ; p != NULL ; p = p->next )
if ( m < p->data ) // それ以降から大きい物を見つけたら
m = p->data ; // その値を最大値として保存
return m ;
}
}
// 最大値再帰版
int max( struct List* p ) {
if ( p == NULL ) // data0件で0を返すことにする
return 0 ;
else if ( p->next == NULL )
return p->data ;
else {
int m = max( p->next ) ; // 以降のデータの最大値より
if ( m < p->data ) // その場所のデータが大きい
return p->data ;
else
return m ;
}
}
// 平均ループ版
double mean( struct List* p ) {
int c = 0 , s = 0 ;
for( ; p != NULL ; p = p->next ) {
c++ ;
s += p->data ;
}
return (double)s / (double)c ;
}
// 平均の再帰版
// ただし、 mean( top , 0 , 0 ) のように呼び出す。
double mean( struct List* p , int s , int c ) { // s はリストの合計
if ( p == NULL ) // c はリストの件数
return (double)s / (double)c ;
else
return mean( p->next , s + p->data , c + 1 ) ;
}
// C++なら、meanの宣言に引数のデフォルト値を指定すれば
// double mean( struct List* p , int s = 0 , int c = 0 ) { ... }
// printf( "%lf" , mean( top ) ) ; みたいな使い方ができる。
// findループ版
int find( struct List* p , int key ) {
int i = 0 ;
for( ; p != NULL ; p = p->next )
if ( p->data == key )
return i ; // 見つかったらi番目
else
i++ ;
return -1 ; // 見つからなかったら(-1)
}
// find再帰版
// ループ版とは返り値の取り扱いが違うので注意
int find( struct List* p , int key ) {
if ( p == NULL )
return 0 ; // 見つからなかった
else if ( p->data == key )
return 1 ;
else
return find( p->next , key ) ;
}