2016-11-15 4 views
-2

平均を計算する関数を作成する必要があります。は平均値よりも大きい値の数を返します。たとえば、{4,5,12,17}の配列を渡すと2が返されます(12と17は平均9.5より大きいため)。今までは平均を返す関数を書いていましたが、平均よりも大きな数値を数え上げ、テール再帰的に保つにはどうしたらいいですか?配列の平均より大きいすべての数を数えるテール再帰関数

int TAvg(int* a, int size, int acc=0, int num=0){ //acc is the sum so far, num is the number of all elements 
if (size == 0){ 
    return (acc/num); 
} 
return TAvg(a, size - 1, acc+a[size-1], num+1);} 

助けてください。ありがとうございました。

+2

は、あなたは私たちがあなたの宿題を解決したいようです。 – user31264

+0

* average *とは、*算術平均*を意味しているようです。 – user2079303

+0

STL ''を見てください:http://en.cppreference.com/w/cpp/algorithm – Gonmator

答えて

1

最終的な再帰関数が最終再帰呼び出しの平均を計算し、呼び出しスタックの巻き戻しを開始すると、再帰呼び出しの巻き戻しによって平均値がわかります。

これは、すべての再帰呼び出しを解除して各要素の平均を比較し、各要素のカウンタを増分することで計算平均を上回るようになりました。

EDIT:私は、テール再帰的デザインの精神をより多く実装する別のアプローチを考えました。あなたの関数は、クラスを返すがあります。

class result { 

public: 

    int average; 
    int counter; 

    result(int average, int last_value) : average(average), counter(0) 
    { 
     if (last_value > average) 
      ++counter; 
    } 

    result(const result &prev_result, int next_value) : average(prev_result.average), counter(prev_result.counter) 
    { 
     if (next_value > average) 
      ++counter; 
    } 
}; 

今すぐあなたの末尾再帰関数がで結果を計算することができます:ビューの一つのポイントに応じて、

  1. 初期再帰呼び出し(または最後の再帰呼び出しを)、計算された平均値を使用して、最初のコンストラクタを使用してresultを構築するであろう、そして配列内の最初/最後の値:

    return result(TAvg(computed_average_goes_here, *acc)); 
    
  2. remaini ngの末尾再帰呼び出しは次のようになります。

    return result(TAvg(/* resursive parameters */), *acc); 
    
+0

正確には、どうしたらいいですか?そして、どこにカウンターを置くべきですか?それはテール再帰的なものなので、呼び出しの後に何も書かれてはならないでしょう –

+0

"あなたのtail-recursive関数がstd :: pair と平均とカウンタを返し、再帰呼び出しを 'update(TAvg(...)、* acc)にすることができます。 '、' update() 'と' * acc'をペアの最初の値と比較し、2番目の値をインクリメントして更新したペアを返す。 –

+2

テール再帰関数**は**スタックを巻き戻さない。それのポイントbeiテール再帰的コールスタックをまったく使用しないコードにコンパイルすることができます。 –

関連する問題