再帰関数を使用する

処理を繰り返し実行するために自分自身を呼び出す関数を再帰関数といいます。

次のスクリプト関数は、パラメータとして渡されたオブジェクトのアニメート化された subAnim の一覧を返します。スクリプトは問題なく実行され、時間もそれほどかかりません。

再帰関数にしない場合

    fn getAllAnimatedProperties theObject =
    (
      scan_properties = #(theObject)
      animated_props = #()
      cnt = 0
      while cnt < scan_properties.count do
      (
        cnt +=1
        currentObj = scan_properties[cnt]
        if try (currentObj.isAnimated) catch (false) do
          append animated_props currentObj
        for i = 1 to currentObj.numSubs do
          append scan_properties currentObj[i]
      )
      animated_props
    )
    s=sphere isSelected:true
    getAllAnimatedProperties $

では、次のコードを見てみてください。

再帰関数にする場合

    animated_props = #()
    fn getAnimatedProps theObject =
    (
      if try (theObject.isAnimated) catch (false) do
        append animated_props theObject
      for i = 1 to theObject.numSubs do
        getAnimatedProps theObject[i]
    )
    getAnimatedProps $

再帰的に実行するコードの方も同じことを行いますが、大幅に短くなっており、約 25% も高速になっています。参考になる測定値を出すために、両方のスクリプトを 100,000 回実行しました。最初は 13.875 秒かかりましたが、再帰的なバージョンでは 10.656 秒でした。

前のヒント

最終的なサイズがわかっている場合は、配列をあらかじめ初期化しておく

次のヒント

matchPattern は findString より高速である