您的位置:首页 > 其它

一种递归<-->数学转换的方法

2013-05-21 02:18 211 查看
  我们经常会用到递归的思想去解决问题,比如说经典的汉诺塔问题、斐波拉契数列问题、二叉树的递归遍历。。。。。

虽然递归的思想比较直接容易,但是我们知道用递归的效率是很低的。所以我们也经常去探索将递归转换成迭代的方法,下面介绍一类问题的递归-数学转换:

我们先来看这样一个情景:

  悟空喜欢吃桃,第一天悟空吃掉桃子总数一半多一个,
第二天又将剩下的桃子吃掉一半多一个,
以后每天吃掉前一天剩下的一半多一个,
到第n天准备吃的时候只剩下一个桃子。
聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?


这个问题如果用递归的思想去做显得很简单,我们很容易得到他的递推公式:

f[1] = 1;
f
= (f[n-1]-1)/2;


这个问题用迭代也很简单:

for (int i = 1; i <= n; i++)
{
s = (s * 2) + 1;
}


下面提供一种数学方法,直接求出其结果:

本题很容易得到它的递推方程:

f(1) = 1;

f(n) = [f(n-1) + 1] × 2;

于是我们得到:


f(n)+ 2 = 2 × [f(n-1)+ 2]
f(1)+ 2 = 3

=>

f(n)+ 2 = 3 × 2

n-1
=>

f(n) = 3 × 2

n-1
- 2


  当然上面是运用我们在高中就学过的数列的知识解决这个问题,对于这种推断题还有另外一种递推方法,虽然对于本题来说很麻烦。但有时候它是无可替代的。


f(1) = 1;
f(n) = 2f(n-1)+ 2 = f(n-1)+ 2f(n-2) + 4;

=>

f(n) + f(n-1) + 4 = 2 × [f(n-1) + f(n+2) + 4];

设 g(n) = f(n) + f(n-1) + 4;

则 g(n) = 2 × g(n-1);
g(2) = f(2) + f(1) + 4 = 9;

∴g(n) = 9 × 2

n-2
(n > 1)

∴f(n)   + f(n-1) = 9 × 2

n-2
- 4	①
f(n-1) + f(n-2) = 9 × 2

n-3
- 4	②
┋
f(3)   + f(2)   = 9 × 2 - 4
f(2)   + f(1)   = 9 - 4

把①式减去②式得
f(n)   = 9 × 2

n-3
+ f(n-2)
f(n-2) = 9 × 2

n-5
+ f(n-4)
┋


这时候,我们需要分类讨论了:

n为奇数

f(n)   = 9 × 2

n-3
+ f(n-2)
f(n-2) = 9 × 2

n-5
+ f(n-4)
┋f(5)   = 9 × 2

2
+ f(3)
f(3)   = 9 + f(1)
f(1)   = 1

从下往上迭代,得:
f(n) = 9 × (2

n-3
+ 2

n-5
 + ...+ 2

2
+ 1) + 1
=>
f(n) = 9 × (1 - 4

(n-1)/2
) ÷ (1 - 4) + 1
=>
f(n) = 3 × 2

n - 1
 - 2



n为偶数

f(n)   = 9 × 2

n-3
 + f(n-2)
f(n-2) = 9 × 2

n-5
 + f(n-4)
┋f(4)   = 9 × 2

1
+ f(2)
f(2)   = 4

从下往上迭代,得:
f(n) = 9 × (2

n-3
+ 2

n-5
 + ...+ 2

1
) + 4
=>
f(n) = 9 × 2 × (1 - 4

(n-2)/2
) ÷ (1 - 4) + 4
=>
f(n) = 3 × 2

n - 1
 - 2



现在我们就得到了这道题目的公式了: f(n) = 3 × 2n - 1 - 2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: