配列の要素を削除し続ける(つまり、1番目、2番目などを扱うときに配列を縮小する)ことが可能ですか?新しいパラメータとして渡します同じ関数(つまり再帰的)に?配列を再帰的に縮小して新しいパラメータとして渡す
お客様の変更に必要な各コインの数を計算する簡単な方法を考えていますが(自動販売機など)、ネストループを使用するすべてのGoogle検索結果で混乱しています...(私が理解しにくいことを意味する)私は、私がこの問題を解決するための簡単な再帰呼び出しに私の思考を翻訳できるかどうかを見極めることにしました。
私がこれまで持っていたことは次のとおりです。例えば、10,20,50,100、そして200コインの金種リストがあれば、マシンは80セントを返すとします。人間は考えるだろう:最初の硬貨は80よりも小さいので50セントであるので、50セントにする必要があり、残りは30セントになります。
30未満の最初のコインは20セントですので、残りの残りのコインは10セントです。残りの部分よりも少ない(またはこの場合は等しい)最初のコインは、10セントで処理を完了します。
それで、各ステップで、私を助ける最大の硬貨の貨幣を世話した後、私はあまりにも多くの他の大きな硬貨を「無視する」。すなわち、私は役に立たないコインの金種を取り除いています。
私は単純な思考方法をコード化していますが、私は次のことを思いつきましたが、今この "コインデノミネーション配列縮小"をコードにどのようにマッピングできるのでしょうか?これは私がtemp
配列を置いたところでハイライトされています...
私が始めたとき、私はcoins[1]
であった2ユーロの硬貨(200)をチェックしました。だからcoins[2]
は1ユーロだった。そして、50セントのコインがソートされました(coins[3]
)ので、今度はcoins[4]
とcoins[5]
に同じメソッドCalculate
を実行したいと思います。これはインデックス4と5だけを含む新しい軸配列と考えることができます問題を解決し続けることができます。
これも可能ですか?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CoinsConsole
{
class Program
{
static void Main(string[] args)
{
int[] coins = new int[5] { 200, 100, 50, 20, 10 };
Calculate(coins, 80); // 50 + 20 + 10
Console.ReadLine();
}
static []int Calculate(int[] coins, int change)
{
int[] counts = new int[5] { 0, 0, 0, 0, 0 };
int remaining;
for (int i = 1; i <= coins.Length; i++)
{
if (coins[i] <= change)
{
remaining = change - coins[i];
++counts[i];
[]int temp = coins.Skip(i);
Calculate(temp, remaining);
}
}
return counts;
}
}
}
編集1:これは単なるarray.Skip(n).Take(n)
の複製ではありません。再帰のために変更された配列を渡す方法を理解しようとしています。例えば私はarray.Copy
または同じ打ち切ら配列を、使用する必要があるかどうかなど...
EDIT 2:私は私が新しい短縮配列に渡すべきだと思う方法を取り入れているが、coins.Skip(i)
とCalculate(temp, remaining)
は、すべての赤下線を付しています。私は間違って何をしていますか?
[C#の配列スライス]の複製が可能です(http://stackoverflow.com/questions/406485/array-slices-in-c-sharp) –
本当に配列を減らしたいですか?いくつかの変更は2つの '2€'コインを使用する必要があるかもしれません。例えば。 '4.65€'コインの配列を減らすことはあなたを遠くに得ることはできません。 – CSharpie
私はこのアプローチをとるべきかどうか本当に分かりません。私はあなたのことを知っているので、ありがとう。それを達成するために私の既存のコードをどのように変更し、あなたが指摘した潜在的な問題を避けますか? – Joshua