使用递归解决一些问题

1:字符串反转 “abcde”=>"edcba"

直接贴代码:

private static String f(String str) {
  if(str.length()==0) return"";
  return f(str.substring(1))+str.charAt(0);
 }

2:将 ABCD全排列

分析:


A


B


C


D

   对于以上递归我们只要找到解决问题的相似处,然后在找到出口,即可解决。对于该问题,我们试着将A与其他元素依次交换,对于其后面的元素我们也可同样这样考虑。

//参数1:元素数组
 //参数2:表示该将哪一个元素依次与其他元素交换
 private static void pailie(char []str,int n){
  //出口
  if(n==str.length){
   for(int i = 0; i <n;i++){
    System.out.print(str[i]+" ");
   }
   System.out.println();
   return;
  }
  //相似解决方案
  for(int i = n;i<str.length;i++){
   char tem = str[n];str[n] = str[i];str[i] = tem;//将n位置的元素与其他位置的元素交换
   pailie(str,n+1);//递归到下一层执行相似的步骤
   tem = str[i];str[i] = str[n];str[n] = tem;
   //当下一层返回结果时将当前交换的元素恢复,让当前元素与其他元素进行交换
   //称之为回溯
  }
 }

结果:

时间: 2024-10-29 04:37:32

使用递归解决一些问题的相关文章

汉诺塔递归解决方法经典分析

一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 虽然这只是一个传说,但也给我们提出了一个问题,

递归解决换零钱问题--回顾总结之递归的表达能力

前面为了保持叙述的流畅,没有做太多的引申,把总结推迟到了后面. 补上一些总结,以防止出现"下面呢?下面没有了"的尴尬. 方向性问题 虽然题目在一开始就暗示了这一点,但首先,我们还是要问,它能用递归解决吗? 有点怀疑精神是好的,既要低头走路,更要抬头看路,以防止发生方向性错误,导致缘木求鱼的后果. 说这个问题能用递归解决,这种信心或者判断的依据来自于哪呢? 有人可能知道了,换零钱这个问题在<计算机程序的构造和解释>(SICP:Structure and Interpretat

巧用递归解决矩阵最大序列和问题

之前同事问了一道需要点脑洞的算法题,我觉得蛮有意思的,思路可能会给大家带来一些启发,特意在此记录一下 题目 现有一个元素仅为 0,1 的 n 阶矩阵,求连续相邻(水平或垂直,不能有环)元素值为 1 的序列和的最大值 假设有如下矩阵 则此矩阵连续相邻元素为 1 的序列和分别为 4, 3,(如图示),可知这个矩阵序列和的最大值为 4 解题思路 要算序列和的最大值,我们可以先找出所有可能的序列和,然后取其中的最大值,那怎么找这些序列呢? 首先我们发现,每个序列的起点和终点必然是 1,我们可以遍历矩阵的

一招教你巧用递归解决矩阵最大序列和问题

之前同事问了一道需要点脑洞的算法题,我觉得蛮有意思的,思路可能会给大家带来一些启发,在此记录一下 题目 现有一个元素仅为 0,1 的 n 阶矩阵,求连续相邻(水平或垂直,不能有环)值为 1 的元素组成的序列和的最大值.假设有如下矩阵 则此矩阵连续相邻值为 1 的元素组成的序列和分别为 4, 3,(如图示),可知这个矩阵符合条件的序列和的最大值为 4 解题思路 要算序列和的最大值,我们可以先找出所有可能的序列,自然就找到了序列和的最大值,那怎么找这些序列呢?首先我们发现,每个序列的起点和终点必然是

Python中的函数递归思想,以及对比迭代和递归解决Fibonacci数列

什么是递归?简单的说就是:函数自身调用自身. "普通程序员用迭代,天才程序员用递归" 虽然递归 在运行时会不断出栈压栈,调用底层的寄存器,造成空间上的占用以及时间上的缓慢, 但在一些算法上面仍然是递归很实用 但需要注意的是: #递归是自己调用自己 很消耗时间,还会有消耗空间的危险,所以递归递归一定要知道"归去来兮" #所谓"归去来兮"就是指递归的两个原则: #1.调用了函数自身 #2.设置了自身正确的返回值 (必须有一个正确的返回停止条件,不能无

递归解决根据父节点遍历权限树菜单的问题--------mysql数据中的树表

本人几乎没写过博客,感觉要学的知识和要做的事情太多,没时间.但发现用博客记录自己学习心得非常好,就抽时间写点,供自己以后参考也分享给某些需要的人,我水平有限,请多指教! 最近在独自尝试开发一个小型的oa系统以巩固下自己对java ssh框架的学习.这里记录下开发中的一些心得体会. 我把系统菜单设计成树,用一张表存储,各个菜单项之间是父子关系,当我们要根据用户权限去数据库中取菜单项时,发现sql语句不好解决.之前在网上查看了一些帖子博文,发现oracle中有对这个需求有专门的sql语句:类似这样

使用递推和递归解决斐波那契数列问题~~~

/** * 使用递推的方式处理斐波那契数列 * @param sum * @param i * @return */ public static int findValue(int n){ if(n==1) { return 1; } if(n==2) { return 2; } int sum=1; int pre=1; for(int i=3;i<=n;i++) { int temp=sum; sum+=pre; pre=temp; } return sum; } /** * 采用递归的方式

递归解决战士打靶N坏一共有多少种可能的问题

问题描述 一个战士打了10次靶,一共打了90环,问一共有多少种可能,并输出这些可能的组合. 思路 首先,嵌套10层循环进行穷举是不可取的,一是因为速度太慢,二是如果改成打20次靶就完蛋了. 其实这就是一个树的搜索问题. 1. 设第一次打了0环,那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次所有可能的环数都做为root的子结点 3. 重复1, 2步 这样就构成了一棵树,表示当第一次打了0环时所有的可能性.我们要做的就是从上到下遍历这棵树,当经过的结点之和等于90

C#递归解决汉诺塔问题(Hanoi)

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExample_Hanoi_{    class Program    {        static void Main(string[] args)        {            HanoiCalculator c = new HanoiCalculator();            Cons