再帰呼び出し(リカーシブコール)を使ったプログラム

2011.09.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

情報処理試験などに出てくる「再帰呼び出し」というプログラム構造のサンプルを作ってみます。
再帰呼び出しとは関数内で再びその関数自身を呼び出すことです。
まずはJavaのサンプルです。指定したフォルダ内のすべてのファイル名をトレースするだけのプログラムです。
サンプルではCドライブ直下にsampleフォルダを作成していますが適当に書き換えて下さい。
import java.io.File; import java.io.IOException;

public class Main {

public static void main(String[] args) { try{ File rootDir = new File("C:\\sample"); traceFileName(rootDir); System.out.println("終了");

}catch(IOException e){ System.out.println(e); } }

private static void traceFileName(File file) throws IOException{ if(file.isDirectory()) { System.out.println(file.getName());

File[] files = file.listFiles(); for(int i = 0; i < files.length; i++) { // 配下のファイルに対してtraceFileNameメソッドを実行 traceFileName(files [i]); } } else { System.out.println(file.getName()); } } }[/java]
次はFlexでサンプルを作ってみます。今度はフラットなデータを階層構造のあるデータに変換してTreeのdataProviderに代入します。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
			   creationComplete="creationCompleteHandler(event)">
	<fx:Declarations>
		<fx:Array id="dp">
			<fx:Object code="1" parentCode="0"/>
			<fx:Object code="2" parentCode="1"/>
			<fx:Object code="3" parentCode="1"/>
			<fx:Object code="4" parentCode="1"/>
			<fx:Object code="5" parentCode="2"/>
			<fx:Object code="6" parentCode="2"/>
			<fx:Object code="7" parentCode="3"/>
		</fx:Array>
	</fx:Declarations>
	
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
			
			protected function creationCompleteHandler(event:FlexEvent):void {
				var treeData:Object = {code:"0"};
				convertToTreeData(dp, treeData);
				tree.dataProvider = treeData;
			}
			
			private function convertToTreeData(items:Array, parent:Object):void {
			
				for each(var item:Object in items) {
			
					if(item.parentCode == parent.code) {
						if(!parent.hasOwnProperty("children")) {
							parent.children = new Array();
						}
			
						parent.children.push(item);
						convertToTreeData(items, item);
					}
				}
			}
		]]>
	</fx:Script>
	
	<mx:Tree id="tree" width="100%" height="100%" labelField="code"/>
</s:Application>


実行すると以下のようになります。 [SWF]http://public-blog-dev.s3.amazonaws.com/wp-content/uploads/2011/09/SampleTree3.swf, 500, 400[/SWF]

このサンプルを見るにはFlash Playerがインストールされている必要があります。

階層構造のデータを扱う場合はとても便利ですが、呼び出すたびに引数とローカル変数の領域をメモリ上に確保するので注意が必要です。