将递归程序转变为迭代程序的方法

在面试中,我们经常会被要求写一段程序解决某一个问题或提供某个功能,当我们写出用递归给出解法后,面试官往往会问有没有迭代的解法,这个时候面试者经常是束手无措,因为老实说迭代的解法是比较难相处的,所以本文就提供将递归程序转变为迭代程序的通用方法。

递归程序和迭代程序是可以互相转化的!
将递归程序转化为迭代程序的方式是使用栈,这是栈常见的一个用处。因为计算机实现递归的本质就是用栈。

一、第一种方法:尾迭代

尾迭代:如果一个递归函数在函数体中只有一个地方调用自身且这个地方位于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;
}

二、第二种方法:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值