`

递归与分治策略(一):推卸责任是不对的

阅读更多

引言:据说一群在毕达哥拉斯领导下工作的古希腊数学家,发现了数字系列1,3,6,10,15,21...
中有一种奇特的联系。你能知道这个数字的系列的下一个数字是什么吗?
给你一点思考的时间,在这里停下来得出你自己的想法并验证你的结论,别往下偷看哦。

当我看到这个数字系列时我想起了中学时找通项公式的方法:
(你可以先采用归纳法,不一定一次就能找出来,贵在参与。。。)

第一项的值为初始值: n=1,f(1)=1;
第二项的值:        n=2,f(2)=f(1)+2=1+2=3;
第三项的值:        n=3,f(3)=f(2)+3=3+3=6;(靠谱O(∩_∩)O~)
第四项的值:        n=4,f(4)=f(3)+4=6+4=10;(靠谱,不过继续)
第五项的值:        n=5,f(5)=f(4)+5=10+5=15;
..........
..........
第N项的值:         n=n,f(n)=f(n-1)+n;

基本上已经找出规律来了吧,你也可以采用数学归纳法来证明一下你的结论,说到这里,真有点怀念中学时代啊。
不过我想大多数人都不会那么去做?
How to do?Let computer just do it!

A.用循环证实你的想法:

public int triangle(int n){

 int total=0;
 while(n>0)       //直到n=0
   {
   total=total+n;
   --n;
   }
   return total;
}
这个循环一直做了n次,直到n=0时exit

B.使用递归查找第N的值:
递归用一种形象的说法,就是推卸责任给别人,比如说,Marry问你道小学数学题,她很高兴地拿着
漫画版数学课本来问你:“哥哥,n=1,f(1)=1...,n=8,f(8)=f(7)+8;n=9,f(9)=?"
而你说:"Marry,你告诉我f(8)的值,我就告诉你f(9)的值。。。"
结果Marry就哭着去告诉妈妈说我欺负他。

妈妈过来看见我正在玩游戏,有点不高兴,于是我赶快用计算机给她算了算,并偷偷对Marry说:
What is f(9)?Let computer just do it and tell us!

其实我什么也没做,这一切全是Marry以及出这道题的人告诉你的答案!

public int triangle(int n){
  return (n + triangle(n-1));
}

在计算机里运行一下你也许会发现一个问题,就是它并没有给你返回一个结果,而是无限的循环下去。。。
没有答案,怎么办?

推卸责任是不对的...

How to do?

C.不推卸责任:

为了防止无限重复推卸责任,使你的计算机陷于无法自拔的境地,你只需要找到JUST one!
也就是当n=1的时候,f(1)=1是知道的,你仅仅要做的就是找到f(1)帮你解围,而不是无限的推卸责任和扯皮!
所以推卸责任到此为止,STOP here!

public int triangle(int n){
  if(n==1)
    return 1;
  else
    return (n + triangle(n-1));
}

说明:每一个递归方法都有一个基值(终止)条件,此时我们称为基值情况。

上面就是我们经常遇到的三角数字的应用。

D.总结一下递归方法特征:

(1)调用自身。
(2)当它调用自身的时候,它这样做是为了解决更小的问题,这也是一种分治策略。
(3)总存在某个足够简单的问题的层次,在这一层算法不需要推卸责任就可以直接解答且返回结果。

E.递归方法有效率吗?
递归就是程序设计中的数学归纳法。
人们掌握了递归方法之后,常常采用递归,是因为它从概念上简化了问题,它采取分治的策略,使规模化小,
从而变得更加简单,而不是因为本质上更有效率。
这个方法的大规模调用,对CPU和内存都有额外的开销。它需要在系统内存空间存储所有的中间参数以及返回值,
如果大量的数据需要存储,就会引起栈溢出的问题。当大规模自身方法调用时可考虑消除递归。
下回将讨论这个问题,以及汉诺塔问题,递归的二分查找,变位字的全排列问题。。。Sleeping

分享到:
评论
3 楼 rink1969 2009-12-15  
原始递归
极小化运算
广义单元函数
2 楼 Trustno1 2009-12-15  
其实这个数列放在这里做讲解递归的Sample是大材小用了.这个数列经过推广后,是一个极其重要的数学结果.在并行计算里面,没有这个数列几乎80%的并行算法是无解的,所以以前很多Vector Process里面把它做成了一个Primitive Operation.

1 楼 kimmking 2009-12-15  
n(n+1)/2

相关推荐

    递归与分治策略 递归与分治策略

    递归与分治策略是计算机科学中两种重要的算法设计方法,它们在处理复杂问题时有着广泛的应用。递归是一种解决问题的方法,它通过调用自身来解决更小规模的同类问题,直到达到基本情况,可以直接得出答案。而分治策略...

    计算机算法设计与分析的递归与分治策略

    递归与分治策略是学习计算机算法设计与分析的基础,掌握了这样的思想才能良好地高效率地去解决一些问题

    递归与分治策略及其应用

    在计算机科学领域,递归和分治策略是两种强大的算法设计方法,它们广泛应用于解决复杂问题,提升程序的效率和可读性。本主题将深入探讨这两种策略,并结合实际问题——整数划分和特殊棋盘覆盖问题进行实例解析。 ...

    算法设计与分析 递归与分治策略.docx

    **算法设计与分析:递归与分治策略** 递归与分治策略是算法设计中的重要方法,它们常用于解决复杂问题。本实验报告主要探讨了三种使用递归策略的算法:Ackerman函数实现、大数划分以及数据集合的排列组合。 1. **...

    递归与分治策略.ppt

    理解递归的概念 掌握设计有效算法的分治策略:分治法的基本思想 通过范例学习分治策略的算法分析及设计技巧 二分搜索技术、大整数的乘法、Strassen矩阵乘法 合并排序和快速排序

    递归与分治策略

    计算计算法课件。递归与分治的思想以及几个经典问题

    第2章 递归与分治策略.pdf

    总体来说,递归与分治策略在算法设计中是一种非常强大的工具,它可以帮助我们把复杂问题拆解为小问题,并且利用递归结构将解组合起来,得到最终的答案。掌握递归和分治策略对于任何希望深入理解算法和数据结构的IT...

    算法与分析实验一:分治与递归

    在“算法与分析实验一:分治与递归”中,我们重点探讨了如何将分治法应用于具有特定规则的网球循环赛日程表设计问题,旨在加深对分治策略的理解,并将理论知识付诸实践。 分治法的核心思想是将一个难以直接解决的大...

    C 语言程序设计:递归与分治策略.ppt

    C语言程序设计:递归与分治策略 递归和分治策略是C语言程序设计中的两个重要概念。递归是一种算法设计技术,通过将问题分解成更小的子问题,并递归地解决这些子问题来解决原问题。分治策略是将问题分解成更小的子...

    递归和分治策略算法实现

    本资源是从众多学生中选取出来的优秀范例,运行效率较高,包含完整可执行代码和详细算法...范例中包含了士兵战队,集合划分等5个基于递归与分治策略算法实现的问题,每个范例都有详尽代码和算法分析PPT!学习的好材料。

    递归与分治实验(二)

    递归与分治实验(二)Problem A:再次Hanoi塔问题Problem B:输油管道问题Problem C:Integer FactorizationProblem D:邮局选址问题Problem E:Gray code

    棋盘覆盖算法 ,算法设计与分析,递归与分治策略

    在一个2的k次方乘以2的k次方个方格的棋盘中,恰有一个方格与其他方格不同为特殊方格,棋盘称为特殊棋盘,用4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

    第2章 递归与分治策略

    算法中的递归与分治策略,这是老师上课的讲课的时候用的PPT,觉得不错!

    算法递归与分治

    在计算机科学领域,算法是解决问题的关键工具,而“递归与分治”是算法设计中极为重要的策略。本文将深入探讨这两个概念,并结合代码解析,帮助读者理解和掌握它们。 首先,我们来理解“递归”。递归是一种在函数...

    c语言分治法求众数重数-五大常见算法策略之——递归与分治策略,算法数据结构

    通过不断练习和理解递归与分治的原理,开发者可以更好地应对各种编程挑战。不过,需要注意的是,理解和调试递归函数可能会有一定的难度,因此在实际编程中需要谨慎使用,并考虑优化方法以提高效率。

    第2章 递归与分治策略.zip_递归

    **第二章 递归与分治策略** 在计算机科学中,递归和分治策略是两种重要的算法设计方法,它们广泛应用于解决复杂问题。递归是通过调用自身来解决问题的一种编程技术,而分治策略则是一种将大问题分解为小问题进行...

    NOIP普及讲座1-递归与分治(C++版).pdf

    根据给定文件的信息,我们可以总结出以下关于递归与分治技术的重要知识点: ### 一、递归的基本概念 #### 定义: 递归是一种在程序设计中非常重要的方法,它指的是在一个函数或过程中直接或间接地调用自身来解决...

Global site tag (gtag.js) - Google Analytics