在面试中,我们经常会被要求写一段程序解决某一个问题或提供某个功能,当我们写出用递归给出解法后,面试官往往会问有没有迭代的解法,这个时候面试者经常是束手无措,因为老实说迭代的解法是比较难相处的,所以本文就提供将递归程序转变为迭代程序的通用方法。
递归程序和迭代程序是可以互相转化的!
将递归程序转化为迭代程序的方式是使用栈,这是栈常见的一个用处。因为计算机实现递归的本质就是用栈。
一、第一种方法:尾迭代
尾迭代:如果一个递归函数在函数体中只有一个地方调用自身且这个地方位于return处。
尾迭代转化为递归的模式为:
T tailRecursiveFoo(U x, V y)
{
if (bar(x, y))
return baz(x,y);
else
{
⋮ // block 1
return tailRecursiveFoo(w, z);
}
}
To:
T Foo(U x, V y)
{
while (! bar(x, y))
{
⋮ // block 1
x = w;
y = z;
}
return baz(x,y);
}
例子1:
// recursive
int fac1(int n) {
if (n <= 0) return 1;
return n * fac1(n-1);
}
// iterative
int fac2(int n) {
int i = 1, y = 1;
for (; i <= n; ++i) y *= i;
return y;
}
例子2:
unsigned int binarySearch
(T v[], unsigned int n, const T& value)
// search for value in ordered array of data
// return index of value, or index of
// next smaller value if not in collection
{
binarySearch (v, 0, n, value);
}
unsigned int binarySearch
(T v[], unsigned int low, int high, const T& value)
{
// repeatedly reduce the area of search
// until it is just one value
if (low < high) {
int mid = (low + high) / 2;
if (v[mid] < value)
{
return binarySearch (v, mid + 1, high, value);
}
else
{
return binarySearch (v, low, mid, value);
}
}
else
// return the lower value
return low;
}
becomes
unsigned int binarySearch
(T v[], unsigned int n, const T& value)
// search for value in ordered array of data
// return index of value, or index of
// next smaller value if not in collection
{
int low = 0;
int high = n;
// repeatedly reduce the area of search
// until it is just one value
while (low < high) {
int mid = (low + high) / 2;
if (v[mid] < value)
{
low = mid + 1;
}
else
{
high = mid;
}
}
// return the lower value
return low;
}
二、第二种方法: