2016-06-23 27 views
0

関数呼び出しを行うための作業コードがありますが、これはハードコードされています。ループを使って動的にする必要があります。上記のコードで配列から分割文字列に基づいて関数呼び出しを作成する方法

function preorder(tree, node, res, child) { 
    if (node == "") 
     return 
    res[res["count"]++] = node 
    split(tree[node], child, ",") 

    #This must be made dynamic through looping 
    #based on number of childs from the elements of the array 
    preorder(tree,child[1],res) 
    preorder(tree,child[2],res) 
    preorder(tree,child[3],res) 
} 

BEGIN { 
    tree["1"] = "2,3" 
    tree["2"] = "4" 
    tree["3"] = "5" 
    tree["4"] = "6,7" 
    tree["5"] = "8,9" 
    tree["6"] = "10,11,12" 

    preorder(tree,"1",result) 
    printf "Child:\n" 
    for (n = 0; n < result["count"]; n += 1) 
    { 
    printf "\t" 
    printf result[n]" " 
    printf "\n" 
} 
printf "\n" 
    delete result 

} 

、Iツリー(tree["6"] = "10,11,12")、先行順関数必須ループそれを通るという配列の要素6の3つのカンマ区切り値を有しており、各値に対する自己再帰を行うと言います。

preorder(tree,child[1],res) 
    preorder(tree,child[2],res) 
    preorder(tree,child[3],res) 

は動的にする必要があります。

for (value in splitrecords) 
    preorder(tree,child[value],res) 

私はAWKの初心者です。どんな助け?

+0

が、私を気に、より良い解決策を見つけることができなかったいくつかのものがあります。これは何をしたいですあなたは3つだけを通過している! – karakfa

+2

@karakfaでは、関数で使用されるよりも多くの関数パラメータを宣言することは、awkで関数のローカル変数を使用する方法です。この場合、 'child'パラメータは' preorder'関数の呼び出しで決して使用されません。その値は 'split'関数によって破壊されるからです。 – Jdamian

+0

@realspiritualsはAWKの初心者ではないと思います。ただし、コードをコピーして貼り付けていない限りはありません。 – Jdamian

答えて

1

split()への3番目の引数は正規表現であり、文字列ではないので、regexpデリミタを使用してください。

function preorder(tree, node, res, child, i) { 
    ... 
    split(tree[node], child, /,/) 

    for (i=1; i in child; i++) { 
     preorder(tree,child[i],res) 
    } 
    ... 
} 
+0

このスニペットと私が 'for i with child'の違いを説明してください。 – SriniV

+1

ループ内で' in '演算子( 'for i in array)')が各要素を訪問します(配列の中で 'if(i in array)')、それは単に真を返すだけです。そのインデックスに配列 'i'がある場合、ループ制御文の条件文で' in'を使うことができます( 'for(i = 1; 'i'が配列​​インデックスをもはや使わなくなったときに終了します) –

+0

私は' i'関数ローカルを作成して、各再帰関数呼び出しによってグローバルに変更されないようにしました最初の 'preorder'が返ってくると、ローカル' i'は子 'preorder'が呼び出される前と同じ値になります。 –

1
私はわずかな変化でそれを書き直し

、まだ

あなたの先行順機能は、4つの引数が定義されている
function preorder(node, child, t, n) { 
    result[c++] = node 
    if(!(node in tree)) return 
    n=split(tree[node], child, ",") 
    for(t=1;t<=n;t++) preorder(child[t]) 
} 

BEGIN { 
    tree[1] = "2,3" 
    tree[2] = "4" 
    tree[3] = "5" 
    tree[4] = "6,7" 
    tree[5] = "8,9" 
    tree[6] = "10,11,12" 

    preorder(1) 
    print "Child:" 
    for (n=0; n<c; n++) print "\t" result[n]  
} 
+0

あなたの努力に感謝 – SriniV

関連する問題