一种递归<-->数学转换的方法
2013-05-21 02:18
211 查看
我们经常会用到递归的思想去解决问题,比如说经典的汉诺塔问题、斐波拉契数列问题、二叉树的递归遍历。。。。。
虽然递归的思想比较直接容易,但是我们知道用递归的效率是很低的。所以我们也经常去探索将递归转换成迭代的方法,下面介绍一类问题的递归-数学转换:
我们先来看这样一个情景:
这个问题如果用递归的思想去做显得很简单,我们很容易得到他的递推公式:
这个问题用迭代也很简单:
下面提供一种数学方法,直接求出其结果:
本题很容易得到它的递推方程:
于是我们得到:
n-1
n-1
当然上面是运用我们在高中就学过的数列的知识解决这个问题,对于这种推断题还有另外一种递推方法,虽然对于本题来说很麻烦。但有时候它是无可替代的。
n-2
n-2
n-3
n-3
n-5
这时候,我们需要分类讨论了:
n为奇数
n-3
n-5
2
n-3
n-5
2
(n-1)/2
n - 1
n为偶数
n-3
n-5
1
n-3
n-5
1
(n-2)/2
n - 1
现在我们就得到了这道题目的公式了: f(n) = 3 × 2n - 1 - 2
虽然递归的思想比较直接容易,但是我们知道用递归的效率是很低的。所以我们也经常去探索将递归转换成迭代的方法,下面介绍一类问题的递归-数学转换:
我们先来看这样一个情景:
悟空喜欢吃桃,第一天悟空吃掉桃子总数一半多一个, 第二天又将剩下的桃子吃掉一半多一个, 以后每天吃掉前一天剩下的一半多一个, 到第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
相关文章推荐
- 从计算机的核心思想探讨一种进制转换的方法
- 大小写转换的一种方法:不进行判断
- .NET中string[]数组和List<string>泛型的相互转换以及Array类的Sort()方法 【整理】
- 解决java/jsp乱码的一种转换方法
- ASP.NET(5):虚拟路径转换到物理路径的一种实现方法,不用MapPath
- 解决java/jsp乱码的一种转换方法
- eclipse转换工作空间的时候需要配置maven等各种配置 现在有一种简单的方法可以不用复杂配置 只配置一次就行
- <转>根据泛型生成数组 与数组 List相互转换的方法
- java/jsp乱码的一种转换方法
- 如何将十进制数转换成二进制数输出的一种方法
- VC2008中将CString转换成const char*的一种有效方法
- 数学方法模拟(洛谷1017 进制转换NOIp2000提高组第一题)
- FastJSON 转换List<T> ,Map<T,T>泛型失败 处理方法
- 工具方法,将字符创由一种编码转换成另一种编码,UTF-8,GBK,ISO,BIG5。。。。。。
- struts类型转换的一种简便方法
- Extjs:解决<iframe>中src被加载两次第二次加载时无法获取参数值的一种方法
- 一种快速将markdown转换为html的方法
- mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊
- 约瑟夫问题的一种O(n)数学处理方法