1


0

適切なカウントを取得するためのC#再帰

わかりましたので、今日は私の心が適切に動作することはできません当時の一つです。 +これを機能させることはできません(:

class Program
{
    static private List> _list;
    static protected List> list
    {
        get
        {
            if (_list == null)
            {
                _list = new List>();

                _list.Add(new KeyValuePair(1, 11.60));
                _list.Add(new KeyValuePair(2, 11.20));
                _list.Add(new KeyValuePair(3, 13.00));
                _list.Add(new KeyValuePair(4, 13.60));
                _list.Add(new KeyValuePair(5, 15.90));
                _list.Add(new KeyValuePair(6, 16.10));
                _list.Add(new KeyValuePair(7, 19.10));
                _list.Add(new KeyValuePair(8, 19.10));
                _list.Add(new KeyValuePair(9, 19.10));
                _list.Add(new KeyValuePair(10, 21.00));
                _list.Add(new KeyValuePair(11, 23.00));
            }

            return _list;
        }
    }

    static void Main(string[] args)
    {
        Program p = new Program();

        int value = 27;
        double d = p.GetCost(value);
    }

    public double GetCost(int tot)
    {
        double cost = 0;
        if (tot < 1)
            return list[tot-1].Value;

        cost += GetCost(tot - list.Count);
        return cost;
    }
}

したがって、概念的には、再帰GETCOSTプロシージャを適切に動作するように設定し、それ自体を呼び出してLISTからRIGHT値(2番目の列)を取得し、再帰呼び出し元に追加する必要があります。

推測される結果

_  — -- _ 「値」が* 8 の場合、合計はKeyParValue(8-19.10)から $ 19.10 * $ 19.10になります。

「値」が* 12 の場合、合計は $ 36.60 * $ 23 + KeyParValue(11-23.00)+ KeyParValue(1-13.60)から11.60になります

「値」が* 27 の場合、合計は $ 61.90 * + $ 23 + $ 23 + $ 15.90になります。 KeyParValue(11-23.00)+ KeyParValue(11-23.00)+ KeyParValue(5-15.90)から _ _

 — -- _ _

よろしくお願いします、F

5 Answer


2


これは、最初から問題があります。

if (tot < 1)
    return list[tot-1].Value;

「tot」が1未満の場合、「tot-1」はゼロ未満であり、「list [tot-1]」は例外をスローします。

本当に必要ですか?

if (tot < 1)
    return list[tot].Value - 1;

?これは、 `tot`が0の場合にのみ機能します。

そもそもあなたのコードが何を達成することを意図しているのかは明確ではありません-しかし、再帰を使用することでより明確になります。 おそらく、あなたがしようとしていることを説明できますか?


2


これにより、予想される結果セクションで説明した内容が返されます。 しかし、あなたが本当に達成したいことは何か違うように感じます。

public double GetCost(int tot)
{
    double cost = 0;
    while(tot > 0) {
        cost += tot >= 11
                ? list[11]
                : list[tot];
        tot -= tot % 11;
    }
    return cost;
}


0


たぶん、あなたはこのようなものが欲しいです:

public static double GetCost ( int tot ) {
  double  cost = 0;
  if ( tot > list.Count () )
    cost += ( (int)tot / list.Count () ) * list[list.Count () - 1].Value; // add n times the max value
  if ( tot % list.Count () > 0 )
    cost += list[( tot % list.Count () ) - 1].Value; // should add the remainder
  return cost;
}

Visual Studioで今チェックされています。 2番目の例は2つずれています。 34.60(23.00 + 11.60 = 34.60)でなければなりません。 ジョンが指摘したように、0に問題があります。 必要に応じて、ArgumentExceptionをスローするか、ゼロを返します。

編集: Jonの回答に対するコメントから、リストはサンプルのように順序付けられていないと思います。 つまり、合計の計算はインデックスではなくキーに基づいている必要があります。 最初のショット(期待される結果が得られます):

public static double GetCost ( int tot ) {
  int maxKey = list.Aggregate ( ( current, next ) => next.Key > current.Key ? next : current ).Key;
  double cost = 0;

  if ( tot > maxKey )
    cost += ( (int)tot / maxKey ) * list.Where ( kvp => kvp.Key == maxKey ).First ().Value; // add n times the max value
  if ( tot % maxKey > 0 )
    cost += list.Where ( kvp => kvp.Key == tot % maxKey ).First ().Value; // should add the remainder
  return cost;
}

別に見えません。 この関数は、1とmaxKeyの間のすべてのキーが存在することを前提としています。 そうでない場合、必要なキーが欠落している場合に失敗します。


0


再帰やループは必要ありません…​

public double GetCost( int tot )
{
    int multipliers;
    int count;
    double cost;
    var dictionary = list.ToDictionary( kvp => kvp.Key, kvp => kvp.Value );

    count = list.Count;
    multipliers = tot / count;
    cost = multipliers * dictionary[count];
    tot %= count;
    if ( dictionary.ContainsKey( tot ) )
    {
        cost += dictionary[tot];
    }
    return cost;
}

編集:「tot == 0の問題」を修正しました。


0


私は次のようなものに行き、再帰を削除します。 ただし、質問は再帰に関するものなので、再帰ロジックも含めました。 本当にあなたのリストだけがロジックの問題を引き起こしています。

class Program
{
    private static Dictionary _dollarValues;
    protected static Dictionary DollarValues
    {
        get
        {
            if (_dollarValues == null)
            {
                _dollarValues = new Dictionary();

                _dollarValues.Add(1, 11.60);
                _dollarValues.Add(2, 11.20);
                _dollarValues.Add(3, 13.00);
                _dollarValues.Add(4, 13.60);
                _dollarValues.Add(5, 15.90);
                _dollarValues.Add(6, 16.10);
                _dollarValues.Add(7, 19.10);
                _dollarValues.Add(8, 19.10);
                _dollarValues.Add(9, 19.10);
                _dollarValues.Add(10, 21.00);
                _dollarValues.Add(11, 23.00);
            }

            return _dollarValues;
        }
    }

    private static int _maxKey = 0;

    private static void Main(string[] args)
    {
        _maxKey = DollarValues.Max(key => key.Key);
        int value = 27;
        double cost = 0; //GetCost(value); If I wanted to use recursion instead.
        while(value > 0)
        {
            int key = value >= _maxKey ? _maxKey : value;
            cost += DollarValues[key];
            value -= key;
        }
    }
            //Recursion if I had to
    public static double GetCost(int value)
    {
        double cost = 0;
        cost +=
                       value >= _maxKey ?
                              DollarValues[_maxKey] + GetCost(value - _maxKey)
                              : DollarValues[value];
        return cost;
    }
}