1

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;
        }
    }
4

1 に答える 1

2

List.rangeのドキュメントを確認してください。

値を持つ$collstart, start + 1, ..., end - 1

その他の注意事項:

  • あなたの場合、末尾呼び出しの最適化は利用できません。
  • .foldLeft(0)((b, a) => b + a)に等しい.sum
  • 命令型ループソリューションと再帰を組み合わせて、再帰的なリスト処理のみを使用してみてください
于 2012-09-23T16:30:37.107 に答える