그것의 C#을하지만, 자바 쉽게 convertable해야한다 :
class ImmutableStack<T>
{
public readonly T Head;
public readonly ImmutableStack<T> Tail;
public ImmutableStack(T head, ImmutableStack<T> tail)
{
this.Head = head;
this.Tail = tail;
}
public static ImmutableStack<T> Cons(T head, ImmutableStack<T> tail)
{
return new ImmutableStack<T>(head, tail);
}
public static ImmutableStack<T> Reverse(ImmutableStack<T> s)
{
ImmutableStack<T> res = null;
while (s != null)
{
res = Cons(s.Head, res);
s = s.Tail;
}
return res;
}
}
class Program
{
static void AwesomeRecursion(int toDepth, int start, int max, ImmutableStack<int> indices)
{
if (toDepth < 0)
{
throw new ArgumentException("toDepth should be >= 0");
}
else if (toDepth == 0)
{
Console.Write("indices: ");
indices = ImmutableStack<int>.Reverse(indices);
while (indices != null)
{
Console.Write("{0}, ", indices.Head);
indices = indices.Tail;
}
Console.WriteLine();
}
else
{
for (int i = start; i < max; i++)
{
AwesomeRecursion(toDepth - 1, i + 1, max, ImmutableStack<int>.Cons(i, indices));
}
}
}
static void Main(string[] args)
{
AwesomeRecursion(4, 1, 10, null);
Console.WriteLine("Done");
Console.ReadKey(true);
}
}
가 변경 가능한 스택 또는 큐보다 훨씬 쉽게 그래서 역 추적하게하기 때문에 우리는 불변의 스택에 인덱스를 유지한다.
나는 개인적으로 joel.neely의 대답을 수정하지 않는 것이 좋습니다. 올바른 답을 제공하는 동안 팀의 모든 사람들이 for-loop를 감싸는 클래스를 보게 될 것이라고 생각합니다.) "어려운"부분은 가변적 인 배열이나 큐를 사용하여 수행 할 수있는 인덱스를 추적하고 있으며, 하지만 불변의 콜렉션에 아이템을 보관할 때 훨씬 쉽게 되돌릴 수 있습니다. – Juliet