Показать сообщение отдельно
Старый 13.07.2011, 19:21
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 14  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
ОК, вот ожидаемый вариант, с объяснением:
Код AS3:
package tests.random
{
	import flash.display.Sprite;
 
	public class ReverseListExample extends Sprite
	{
		private var _stack:Array = [];
 
		public function ReverseListExample()
		{
			super();
			this.test();
		}
 
		private function test():void
		{
			var list:Object;
			for (var i:int = 10; i; i--) list = this.cons(i, list);
			trace(this.listToString(list));
			list = this.reverse(list);
			trace(this.listToString(list));
		}
 
		private function reverse(list:Object):Object
		{
			var result:Object;
 
			while (list.next)
			{
				this._stack.push(list);
				list = list.next;
			}
			result = list;
			while (this._stack[0]) list = list.next = this._stack.pop();
			list.next = null;
			return newList;
		}
 
		private function cons(car:Object, cdr:Object):Object
		{
			return { value: car, next: cdr };
		}
 
		private function listToString(list:Object):String
		{
			var result:String = "(" + list.value;
			if (list.next != null)
				result += " " + this.listToString(list.next).substr(1);
			else result += ")";
			return result;
		}
	}
}
Идея заключается в том, что делается операция в 2 действия: первое, пройти по всему списку и сложить его в стек, второе - забрать из стека.
Внимание: во Флеше это не будет самым оптимальным вариантом, в виду того, что во флеше с коллекциями есть, скажем так... недопонимание... но в теории это самое простое, что можно сделать (и если пойти дальше и разобрать ситуацию на уровне регистров / директив процессора такой подход был бы действительно самым оптимальным).
__________________
Hell is the possibility of sanity