0

リスト L、オブジェクト x、および正の整数 k を指定すると、k 番目の位置に x が挿入された L のコピーを返す関数を定義します。たとえば、L が [a1, a2, a3] で k=2 の場合、[a1, x, a2, a3] が返されます。L の長さが k 未満の場合は、最後に挿入します。この種の問題では、たとえば長さ関数を使用しないことになっています。関数が長さを計算する方法を考えてみてください。「if-then-else」や補助機能はありません。

リストの長さを見つける関数を作成する方法を理解しました

fun mylength ([]) = 0
| mylength (x::xs) = 1+ mylength(xs)

しかし、質問が述べているように、これを挿入機能の補助機能として使用することはできません。また、挿入機能の使い方がわかりません。ヘルプやガイダンスをいただければ幸いです。

4

2 に答える 2

1

これを行う方法は次のとおりです。リストの関数末尾に渡す各再帰呼び出しと (k - 1) - リストの末尾にある新しい要素の位置。リストが空の場合、単一要素のリストを作成します (これはあなたに与えられたものです)。k が 0 の場合、リストの残りの部分に要素を追加します。戻る途中で、前にアンラップしたリストのすべてのヘッドを追加します。

fun kinsert [] x k = [x]
  | kinsert ls x 0 = x::ls
  | kinsert (l::ls) x k = l::(kinsert ls x (k - 1))

インデックスが 0 のリストを使用しました。1 インデックスが必要な場合は、0 を 1 に置き換えます。

ご覧のとおり、mylength関数とほぼ同じです。違いは、再帰には 2 つの基本ケースがあり、帰りの操作は+ではなく::.

編集

このように呼び出すことができます

kinsert [1,2,3,4,5,6] 10 3;

3 つの引数があります。長さ関数とは異なり、引数をタプルにラップしません。

于 2013-09-13T22:04:59.193 に答える
1

これが私がそれにアプローチする方法です。以下は、リスト項目がゼロから始まることを前提としています。

fun mylength (lst,obj,pos) =
    case (lst,obj,pos) of
        ([],ob,po)=>[ob]
          | (xs::ys,ob,0) => ob::lst
          | (xs::ys,ob,po) => xs::mylength(ys,obj,pos-1)
于 2013-09-13T21:59:23.977 に答える