- 1、本文档共59页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
经典递归算法辅导讲解课件_蓝桥杯软件大赛辅导_技能大赛资料
递归与分治策略 算法总体思想 将要求解的较大规模的问题分割成k个更小规模的子问题。 递归的概念 直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。 分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。 递归的三个条件 1、边界条件 2、递归前进段 3、递归返回段 当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 简单的递归(求和) 简单的递归(求和) 简单的递归(阶乘) ? 简单的递归(阶乘) public static int f(int n) { ? ? ? ? ? if (1 == n) ?? ? ? ? ? ? ? return 1; ? ? ? ? ? else ?? ? ? ? ? ? ? return n*(n-1); ? ? ? } ? 简单的递归(阶乘) 简单的递归(阶乘) 递归调用执行情况 简单的递归(十进制转二进制) static void d2b(int n) { if(n==0 || n==1) ; //System.out.print(n); // 递归出口 else d2b(n/2); System.out.print(n%2); } 递归的目的 使用递归的目的在于解决一种常见问题,即子任务只不过是开始试图解决的相同问题的一个较简单版本。 简单的递归(纵向显示整数) 例子:在屏幕上以十进制打印一个非负整数,要求所有位纵向显示在屏幕上。举例来说1234显示如下 1 2 3 4 可以划分为2个问题: 纵向打印出除最后一位之外的所有位; 打印最后一位。 把1234记为number。 简单的递归(纵向显示整数) 应该这样打印: 1 2 3 第二步输出 4 第一步需要123,可以表示为number/10。 第二步表示为number%10。 按照递归的思想,其中一步——纵向打印number/10的所有位,是同一个纵向打印数字问题的一个比较简单的实例。因为number/10比number少了一位,所以比较简单,就可调用方法自身来实现。 简单的递归(纵向显示整数) 方法writeVertical的实现 public static void writeVertical(int number){ if(number10){ System.out.println(number); }else{ writeVertical(number/10); System.out.println(number%10); } } 简单的递归(纵向显示整数) 停止条件 如果问题足够简单,就可以不用递归调用解决。对于writeVertical,这发生在number只有一位时。这种没有任何递归的情况叫做停止条件或基本条件。在writeVertical方法中,停止条件由三行代码实现: if(number10){ System.out.println(number); } 简单的递归(纵向显示整数) 递归调用 else{ writeVertical(number/10); System.out.println(number%10); } writeVertical方法调用它自己去解决比较简单的问题,即打印最后一位数字之外的所有位。 递归的概念 对writeVertical进行扩展,以处理所有整数,包括负数。当输入负号时,新方法在输出的第一行打印负号,然后再是其他的位。 怎么处理负数? 打印负号,然后用-1×number把number变为正数。 请尝试写出方法superWriteVertical(int number) 递归的概念 public static void superWriteVertical(int number){ if(number0){ System.out.println(-); superWriteVertical(-number); }else if(number10){ System.out.println(number); }else{ writeVertical(number/10); System.out.println(number%10); } } 简单的递归(斐波那契) 简单的递归(斐波那契) static int f(int n) { if(n==1 || n==2) return 1; // 递归出口 return f(n-1) + f(n-2); } 简单的递归(Hanoi塔问题)
文档评论(0)