Java实验--关于简单字符串回文的递归判断实验

首先题目要求写的是递归的实验,一开始没注意要求,写了非递归的方法。浪费了一些时间,所谓吃一堑长一智。我学习到了以后看实验的时候要认真看实验中的要求,防止再看错。

以下是对此次的实验进行的分析:

1)递归是运用到了栈的思想

2)回文是一段从中间开始倒置的文字,回代的过程中出现不同的符号的时候就说明这段文字不是回文了

根据上面对回文判断的分析,就拿最简单的121来说,要每个字符判断直至2所在的位置,然后依次回代判断前面的1和后面的1的位置(上述的描述就类似于栈的思想)。

有关于栈还有递归其实我并不熟悉,所以此次的实验对我来说算是一次挑战吧。

接下来贴出实验的代码(利用递归实现回文的判断):

package huiwen;

import java.util.Scanner;

public class Huiwen {
    public static void main(String arg[])
    {
        String sz=new String();
        Scanner scan=new Scanner(System.in);
        while(!sz.equals("-1"))
        {
            System.out.println("-------------------------------------\n请输入一个字符串判断是不是回文(输入-1结束输出):");
            if(scan.hasNext())
            {
                sz=scan.next();
                if(sz.equals("-1"))
                    break;
            }
            if(isHuiwen(sz,0))    //给递归一个起点直至字符串的中间,并判断中途有没有不等的情况,如果出现中途不等返回false,反之返回true
                System.out.println("该字符串是回文\n");
            else System.out.println("该字符串不是回文\n");
        }
        scan.close();
        System.out.println("结束判断");
    }
    public static boolean isHuiwen(String s,int n)
    {
        int num=s.length();
        if(num/2!=n)
        {
            if(isHuiwen(s,n+1))
            {
                if(s.charAt(n)==s.charAt(num-n-1))
                    return true;
                else return false;
            }
        }
        else if(s.charAt(n)==s.charAt(num-n-1))
            return true;
        return false;
    }
}

回文的实验截图,在判断的过程中没有错误。

测试图如上所示

但是实验过程,一开始的时候再写递归的时候出现了一些问题,在调用isHuiwen方法的过程中,出现了一直都显示不是回文的情况。然后我对实验中为何会出现这种错误进行了分析,发现原来在判断的过程中由于在递归调用方法的前面加了一条判断语句,就是本来的num/2!=n错误的写成了num/2==n,这种错误是致命的,说明了我对于递归方面的基础还不行,所以对递归函数还得进一步了解。

原文地址:https://www.cnblogs.com/halone/p/9782488.html

时间: 2024-12-13 14:38:16

Java实验--关于简单字符串回文的递归判断实验的相关文章

暑假集训7.11 字符串回文暴力

#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ull; #define MM(a,b) memset(a,b,sizeof(a)); const double eps = 1e-10; const int i

[网易]字符串回文分割

[题目] 将一个很长的字符串,分割成一段一段的子字符串,子字符串都是回文字符串.有回文字符串就输出最长的,没有回文就输出一个一个的字符. 例如:habbafgh 输出h,abba,f,g,h. [思路一] 基于"最长回文子串算法"求出当前字符串的最长回文子串,就可以分成3部分 a.最长回文子串left部分 b.最长回文子串 c.最长回文子串right部分 然后分别求a和c的最长回文子串 递归至每部分都成单个字符+当前最长回文子串,就可以分解成最终结果. [代码一] #include&l

字符串回文现象的递归判断

前面谈到了递归的一些思想,还有概念上的一些理解,这里试着用递归解决一些问题.比如回文. 回文是一种字符串,它正着读和反着读都是一样的.比如level,eye都是回文.用迭代的方法可以很快地判断一个字符串是否为回文.用递归的方法如何来实现呢? 首先我们要考虑使用递归的两个条件:澳门赌场玩法 第一:这个问题是否可以分解为形式相同但规模更小的问题? 第二:如果存在这样一种分解,那么这种分解是否存在一种简单情境? 先来看第一点,是否存在一种符合条件的分解.容易发现,如果一个字符串是回文,那么在它的内部一

算法模板——线段树8 (字符串回文变换)

实现功能:输入一个长度为N的由26个大写字母组成的字符串,输入M条指令:"1 x y",将x到y的字串重组构成一个字典序最小的回文串,如果不能构成回文串输出False,否则True并完成变换:"2 x y"输出从x到y的子串:"3 x y t"将x到y的所有字全部变成chr(t+64)(即对应大写字母) 原理:用一个数组维护字母个数即可,然后再附带一个带tag的区间覆盖操作,实现回文串的重组 1 type 2 vec=array[0..26] o

说一下前天腾讯实习的笔试题--字符串回文问题(动态规划)

题目描述 最长回文子序列: 一个给定的字符串,求其最长回文子序列的长度; 一个回文子序列定义为原字符串的一个子序列去掉某些字符后生成的字符串为一个回文字符串; 例如cabbeaf:回文子序列有:c,a,aa,bb,,aba,abba,e,f,最长的就是abba,所以输出长度为4. 解题思路: 该问题为一个典型的动态规划问题,原串和反转串的最长公共子序列的长度即为该问题的解. 我实现的代码如下(我还多写了一些代码,用递归的方法来求解出了最长公共子序列的字符串): 1 #include <stdio

纪念逝去的岁月——C/C++字符串回文

判断字符串是否是回文: 1. 输入:hello world dlrow olleh 输出:1 2. 输入:nihao hello 输出:0 代码 #include <stdio.h> #include <string.h> int palindrome(char * p) { if(NULL == p) { return 0; } int iLen = strlen(p); int iHalf = iLen / 2; int i = 0, iEnd = iLen - 1; for(

回文语句的判断

引子 看到不少C语言的基础题目里有一道题目是,如何判断一个英文单词是回文的, 即:asdsa | asddsa之类,其特点是从前往后等价于从后往前的,在这个特定的场景下, 大多数人第一反应就是将前后对应位置的字符进行比较,根据相等性比较结果来判断 该单词是否为回文单词,直至判断最中间的两个字符(奇数个字符时,两个字符是指向同一个). 例如: int palindrome(char *str) {     int n=strlen(str);     char *p=str,*q=str+n-1;

算法——回文解密,判断一个素组是否为回文

算法中,队列是先进先出原则,而栈是后进先出原则,栈限定只能在一端进行插入和删除操作,而栈的作用有哪些? 可以通过一组回文字符串来看:"xyzyx",同过栈来判断字符串是否是回文 案例:package test; /** * @author dayu 解密回文--栈 * @version 创建时间:2017年11月13日 下午2:15:01 * 类说明 */ public class zhan { //回文--一定有对称轴,所以一定是单数 public static void main(

回文数的判断

#include<stdio.h> #include<stdlib.h> int reverse(int num) {  int old=num;  int new1=0;  while(num)  {   new1=new1*10+num%10;   num=num/10;  }  if(old==new1)  {   return 1;  }  else   return 0; } int main() {  int num=0;  scanf("%d",&