Scalaでのリスト操作に問題があります。Javaで順次実装した(そして動作した)同じロジックを実装しようとしていますが、予期しない0が返されます。リスト操作を可能な限りデバッグしましたが(提供されたリストのシーケンスへのマップ呼び出しを置き換えました。これは意図したとおりに動作します)、最後のステップを追跡できません(リストメンバーをこの関数の再帰呼び出しにマップします)。私のアプローチについて考えていただけますか?
@tailrec
def a(b: Int, cList: List[Int]): Int = {
if (b == 0) 1
else if (cList.isEmpty) 0
else
List.range(0, b / cList.head).
map(n => a(b - n * cList.head, cList.tail)).
foldLeft(0)((b, a) => b + a)
}
foldLeft
リストの前に、すべての要素の再帰呼び出しの結果が含まれている必要があると思います。そのような呼び出しは機能しますか?わかりやすくするために、Javaプログラムを同封します。これは、想定どおりに動作します。
private static int a(int b, int[] cList) {
if (b == 0) {
return 1;
} else {
if (cList.length == 0)
return 0;
int head = cList[0];
int[] tail = Arrays.copyOfRange(cList, 1, cList.length);
int x = b / head;
int sum = 0;
for (int i = 0; i <= x; i++) {
sum += a(b - (i * head), tail);
}
return sum;
}
}