使用递归的子字符串

时间:2016-12-13 11:00:49

标签: python-2.7 recursion substring

所以我需要使用递归方法编写代码来获取输入的子字符串,如果输入是:

,那么正确的例子就是
  

" ABC"输出必须是:a ab abc b bc c

依旧...... 另一个例子:

  

输入:"你好"输出:赫尔,你好,你好,我爱你好   Ø

a=""
 if len(s)==1:
   return 
 for i in range(0,len(s)):
    for n in range(0,len(s)):   
       a+=s[i:n+1]+'\n'

这是我编写的代码,它完全符合我的需要,唯一的缺点是它不使用任何递归,所以如果有人可以帮助我

2 个答案:

答案 0 :(得分:1)

查看您的预期输出,该程序的摘要可能是:

  1. 写入属于输入字符串的第一个字符(a ab abc
  2. 的所有子字符串
  3. 写下所有剩余的子串(b bc c
  4. 在Python-ish伪代码中:

     def substrings(input):
          output = substrings_using_first_char(input)
          return output + substrings(input[1:])
    

    substrings_using_first_char(),我会留给你。它可以是递归的,但是使用for循环有一个简单的非递归实现。您可以将递归版本编写为练习。

    上面的代码存在问题,但是总是调用自身,所以它永远不会返回,并且会溢出堆栈。所有递归函数/方法都需要停止条件。所以放一个:

     def substrings(input):
          if(input == ''):
              return []
          else:
              output = substrings_using_first_char(input)
              return output + substrings(input[1:])
    

    这符合递归函数/方法的通用格式:

    recursiveMethod(input):
         if(input is simple case with easy answer):
             return answer for the simple case
         else:
             split input into a "small piece" and the "rest"
             return answer made by working with "small piece" and   
    recursiveMethod(rest)
    

    整个事情可以整理一下,删除中间变量:

     def substrings(input):
          if(input == ''):
              return []
          else:
              return substrings_using_first_char(input) + substrings(input[1:])
    

    我已经让它返回一个列表,而不是打印到屏幕上,因为这通常是一种更清晰的编码方式,但您可以根据自己的需要进行调整。

    请注意,由于Python不优化尾递归,因此堆栈溢出在Python中始终存在风险。递归很有用(特别是在使用树时)但是当有一个明显的迭代解决方案时,在Python中通常最好使用它。

答案 1 :(得分:0)

检查一下:

public void test() {
    String abc = "abcdef";
    write(abc, 0, 0);
}

void write(String abc, int start, int end) {
    System.out.println(abc.substring(start, end));
    if (end == abc.length()) {
        if (start < abc.length()) {
            write(abc, start + 1, end);
        }
    } else {
        write(abc, start, end + 1);
    }
}

输出是:

a
ab
abc
abcd
abcde
abcdef
bcdef
cdef
def
ef
f