HSP で「再帰→ループ」の変換をしてみた。

JavaScripter の amachang さんの 「再帰→ループ」の変換が大変だった件 - IT戦記 という記事を読んで、再帰はループで表現できるはず とあったので本当かなあ、と思って HSP でやってみました。

ループに変換する元の再帰スクリプト。全てのサブディレクトリを辿っていくスクリプトです。

// 再帰
#module
#deffunc digFolder str path, local folderList, local folder, local idx
    await
    mes path
    dirlist folderList, path + "\\*.*", 5
    idx = 0
    repeat
        getstr folder, folderlist, idx
        if ( strsize == 0 ) {
            break
        }
        idx += strsize
        digFolder path + "\\" + folder
    loop
    return
#global

#include "hspext.as"

    sdim folder, 512
    selfolder folder, ""
    digFolder folder
    dialog "完了!"
    stop

で、見よう見まねでループに変換しました。スタックは配列変数で代替。

// ループ
#module
#deffunc digFolder str _path, local path, local folderList, local idx, local stack, local folder
    sdim folderList, 8192, 256
    dim idx, 256
    stack = 0
    path = _path

    mes path
    dirlist folderList.stack, path + "\\*.*", 5
    idx.stack = 0
    repeat
        repeat
            await
            getstr folder, folderList.stack, idx.stack
            if ( strsize == 0 ) : break
            idx.stack += strsize
            stack ++
            path += "\\" + folder
            mes path
            dirlist folderList.stack, path + "\\*.*", 5
            idx.stack = 0
        loop

        if ( stack == 0 ) {
            break
        }
        stack --
        // パスを一つ上の階層に戻す ( ex. "C:\aa\bb" -> "C:\aa" )
        path = getpath( path, 32 )
        poke path, strlen( path ) - 1
    loop
    return
#global

#include "hspext.as"

    sdim folder, 512
    selfolder folder, ""
    digFolder folder
    dialog "完了!"
    stop

出来てるー!ちょっと感動。

インフォメーション

公開日時
2007年10月21日 午前10時9分22秒
最終更新日時
2007年10月21日 午前10時12分40秒
カテゴリ
HSP