0

そして、あなたの助けに感謝します。私は現在割り当てに取り組んでおり、誤った再帰呼び出しで立ち往生しています。リストとサイズ(数値)を受け取り、そのリストのチャンク、そのサイズのリスト、および残りのリストを返す単純なCAML-Light関数があります。本当に簡単です。これは過去の PLT-Scheme プロジェクトからの翻訳です。

ただし、再帰呼び出しに問題があります。なぜそれが機能しないのか、私にはわかりません。関数は次のようになります。

let rec cortar texto longitud resultado = match texto, longitud with
            |  _::t,0 -> resultado::(t::[])
            |  c::t,x-> cortar t (longitud-1) (consderecha resultado c);;

経度は、サイズを定義する整数です。「longitud」が 0 に達することはないため、無限にループしているように見えるので、私はひどく間違ったことをしているのではないかと心配しています。

ありがとう!

編集:解決しましたが、実際にはそうではありません...リストでセミコロンではなくコンマを使用して関数を呼び出していたことがわかりました。うん。ほんとありがと!!

4

1 に答える 1

1

コードには非常に多くの問題があるため、答えるのは難しいです。

関数はリストとサイズを取ると言いますが、ここで定義している関数は 3 つのパラメーターを取ります。resultadoパラメータは累積結果のようです。このパラメーターを外部関数に追加するのは少し面倒です。一般に、外部関数が説明と一致するように内部関数に追加する必要があります (つまり、2 つのパラメーターが必要です)。

ステートメントの両方のパターンは、それがnullmatchではないことを前提としています。textoつまり、texto最初または再帰呼び出しで null の場合、関数は失敗します。

あなたの関数は、consderechaどこにも定義されていないという名前の関数を使用しています。逆の短所、つまり、リストの末尾に値を追加すると仮定します。(これはリストを処理する良い方法ではありません。リストの最後に値を追加するのは遅いです。)

ただし、これらの問題をすべて脇に置いておけば、再帰に問題はないと思います。関数が定義されている場合に関数を試してみると、ほとんど機能します。(リストの途中から値が欠落しているようです。)

# cortar [1;2;3;4;5] 2 [];;
- : int list list = [[1; 2]; [4; 5]]

おそらく、停止していないというよりは、関数が開始されていません。3 番目のパラメータを忘れたのでしょうか。

于 2013-04-08T03:57:45.790 に答える