当前位置: 首页 > 知识库问答 >
问题:

将非递归方法更改为递归方法

蓝逸仙
2023-03-14

我有两个非递归方法,其中一个读取字符串中的总“e”字符,另一个检查 ArrayList 是否按字母顺序排列。

public static int counter( String str ) {
      int k = 0;
      for( int i = 0; i < str.length(); i++) {
         if( str.charAt(i) == 'e' || str.charAt(i) == 'E' ) {
            k++;
         }
      }
      return k;
   }
public static boolean isAlpha( ArrayList<String> words ) {
      int n = 0;
      if ( words.isEmpty() ) {
         return false;
      } else if ( words.size() == 1 ) {
         return true;
      }
      while( n < (words.size() - 1) ){
         int j = words.get(n).compareTo( words.get(n + 1));
         if ( j > 0 ) {
            return false;
         }
         n++;
      }
      return true;
   }

递归方法的定义是方法调用自身。我相信我理解这个概念,但要实现它或将其转换为递归方法确实很困难。我怎样才能将这些方法转化为递归方法,同时我应该如何思考?此外,这是我的另一种方法,它只打印出指定数字大小的数字。

public static void printN( int n, int step ) {
      if ( step > Math.pow( 10, n - 1 ) - 1 ) {
         if ( step < Math.pow( 10, n ) - 1 ) {
            if ( step % 2 == 0 ) {
               if ( condition( step )) {
                  System.out.print( step + " " );
               }
            }
         }
      }
      if ( step >= Math.pow( 10, n ) ) {
         return;
      }
      printN( n, step + 1 );
   }

条件方法检查数字的第一个数字(从右起)是否大于第二个数字,并再次检查第二个是否大于第三个数字。该检查过程一直持续到最后一位。是否可以只使用参数值“int n”编写printN“method”?加上只有一个参数值的递归“计数器”方法?

共有1个答案

洪涵亮
2023-03-14

编写递归函数/方法时要考虑的最重要的事情是何时从该方法返回。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(counter("He She They", 0));

        System.out.println(isSortedAlphabatically(List.of("Hello", "World")));
        System.out.println(isSortedAlphabatically(List.of("Good", "Hello", "World")));
        System.out.println(isSortedAlphabatically(List.of("Morning", "Good", "World")));
        System.out.println(isSortedAlphabatically(List.of("Good", "Bad", "Morning", "Evening", "Poor", "Rich")));
        System.out.println(isSortedAlphabatically(List.of("Bad", "Evening", "Good", "Morning", "Poor", "Rich")));
        System.out.println(isSortedAlphabatically(null));
        System.out.println(isSortedAlphabatically(List.of()));
    }

    public static int counter(String str, int count) {
        if (str.isEmpty()) {
            return count;
        }
        if (str.charAt(0) == 'e' || str.charAt(0) == 'E') {
            // Call the function recursively with the substring starting from index 1 and
            // count + 1
            return counter(str.substring(1), count + 1);
        }
        // Call the function recursively with the substring starting from index 1
        return counter(str.substring(1), count);
    }

    public static boolean isSortedAlphabatically(List<String> words) {
        if (words == null || words.isEmpty()) {
            return false;
        }
        if (words.size() == 1) {
            return true;
        }
        return words.get(0).compareTo(words.get(1)) > 0 ? false
                : isSortedAlphabatically(words.subList(1, words.size()));
    }
}

输出:

3
true
true
false
false
true
false
false
 类似资料:
  • 我正在处理我当前的任务,即创建一个LinkedList数据结构,我已经创建了它以及其他方法,它工作得非常好。我正在处理我的最后一个问题,即制作一个toString方法。它应该: toString方法返回列表的字符串表示形式。用逗号分隔每个项目,并用大括号括住这些项目,例如{1,4,7,5}。公共toString方法必须调用私有递归方法来生成以逗号分隔的项目列表。(但您可以在公共方法中添加大括号。)

  • 我正在做运动,我有点困了,需要一些帮助。假设有向图上有以下顶点和边:AB、BC、AD、CD、DC、DE、CE、EB、AE,如下所示 到目前为止,我已经设法通过使用DFS和递归来解决这个问题。我跟踪深度(即距离源有多少边),当深度超过3时,递归函数返回。 我现在想做的是不使用递归来解决它,也就是说,使用堆栈,但我卡住了!如果我使用以下类似的东西(伪代码): 那么我就无法知道每个顶点应该在哪个深度。我

  • 我有一个递归算法,我用它来迭代分层数据结构,但不幸的是,对于一些数据,分层结构太深,以至于我得到了一个StackOverflow错误。我见过这种情况发生在大约150个节点的深度上,而数据可能会增长到更远的程度。对于上下文,这段代码将在有限的环境中运行,改变JVM堆栈大小不是一个选项,数据结构是给定的,代表不同的文件系统和目录和文件。 为了解决堆栈溢出问题,我尝试将算法转换为迭代算法。这不是我以前必

  • 我在深度优先搜索算法实现的递归方法方面遇到了一些麻烦。这是二叉树照片: 该方法在树的右侧(55、89、144)工作得很好,但是当它来到左侧时,它返回nil,即使它输入“是”。那么,代码有什么问题呢?节点是Node类的一个实例,它具有值(整数)并链接到左右子级(Node类的其他实例),如果它没有来自该侧的子级,则为nil。 下面是方法代码:

  • 我无法找到此练习的正确解决方案,以下是任务: (数组中指定字符的出现次数)编写一个递归方法,用于查找数组中指定字符的出现次数。您需要定义以下两种方法。第二种是递归助手方法。 公共静态int计数(char[]chars,char ch) 公共静态int计数(char[]chars, char ch, int high) 编写一个测试程序,提示用户输入一行中的字符列表和一个字符,并显示该字符在列表中的

  • 问题内容: 我正在尝试使用Java中的递归创建Palindrome程序,但是我被困住了,这是我到目前为止所拥有的: 谁能提供解决我问题的方法? 问题答案: 在这里,我为您粘贴代码: 但是,我强烈建议您了解其工作原理, 从您的问题出发,您是完全不可读的。 尝试理解此代码。 阅读代码中的注释