递归 - 向后打印字符串

时间:2015-11-17 02:52:36

标签: java

在java中使用递归向后打印字符串的最有效方法是什么?如果给你这个标题:

public void printBackwards(String s)

3 个答案:

答案 0 :(得分:2)

效率方面最有效的方法是不使用递归。

迭代方法(在字符串上向后循环并打印字符)是线性的,O(N),其中N是字符串的长度。

因为你问的是递归解,所以它是二次的,O(N ^ 2)表示时间复杂度,因为打印了N个字符,并且每个函数调用都有N个子串。 (每次将N-1个字符复制到存储器中)。

  public void printBackwards(String s) {
      if (!s.isEmpty()) {
          int endPos = s.length() - 1;
          System.out.print(s.charAt(endPos));
          printBackwards(s.substring(0, endPos));
      }
  }

答案 1 :(得分:0)

既然你想要递归,我会给你一个提示(因为这个 是你班上的一个问题):

首先打印最后一个字符。你会如何递归地打印它?现在就回去吧!

悬停以显示代码:)

  

public void printBackwards(String s){
     if(s.length()== 0)返回;
     System.out.print(s.charAt(s.length() - 1);
     printBackwards(s.substring(0,s.length() - 1);
 }

答案 2 :(得分:0)

使用递归的最有效的方式是这样的:

static void printBackwards(String s)
{
    printBackwards(s, 0, s.length());
    System.out.println();
}

static void printBackwards(String s, int start, int end)
{
   if ((end-start)<2)
   {
       if (end>start)
       {
          System.out.print(s.charAt(start));
       }
       return;
   }
   int mid = start + (end-start)/2;
   printBackwards(s, mid, end);
   printBackwards(s, start, mid);
}

这比其他答案更有效,因为它不会分配一大堆新字符串而只使用O(log N)堆栈......

但是,实际上你不需要递归来向后打印字符串。

注意:如果这是家庭作业并且你把它交给你,你的教授可能会知道你没有写它:)

相关问题