基本递归

时间:2012-10-16 22:28:24

标签: java recursion

这是我从学校收到的作业问题。问题是,写一个名为capitalizer的方法,它将获取字符串“ownage”,然后显示(不必返回)它的所有可能的大写,例如“OwNaGE”或“OWnAGE”。它不必为每个字符串工作,只需要“ownage”这个词就足够了,它必须通过递归来完成。

这是我到目前为止所拥有的。

import java.util.*;

class MethodAssign2{
   static void capitalizer(String a,int b){
      if(b==-1){
         System.out.println("worked?");
      }else{
         char[] achars = a.toCharArray();
         achars[b] -= 32;
         String caplet = new String(achars);
         System.out.println(caplet);
         System.out.println(a);
         capitalizer(caplet,b-1);
         capitalizer(a,b-1);
      }
   }
   public static void main(String[]args){
      String word = "ownage";
      capitalizer(word,word.length()-1);
   }
}

我的思绪现在完全混乱了。好像我有很多重复的案例。你们认为我接近正确的解决方案吗?如何使基本情况下没有任何事情发生而不是打印出来?我该如何避免重复?任何人请帮助我,我会非常感激。

5 个答案:

答案 0 :(得分:4)

为避免重复 - 您应该只在stop子句中打印字符串,而不是在每次迭代中打印。

static void capitalizer(String a,int b){
    if(b==-1){
        System.out.println(a); //CHANGE: printing in the stop clause
    }else{
        char[] achars = a.toCharArray();
        achars[b] -= 32;
        String caplet = new String(achars);
        //CHANGE: not printing every iteration
        capitalizer(caplet,b-1);
        capitalizer(a,b-1);
    }
}

算法的概念是:在每个阶段,你“猜测”当前字符是什么 - 它是一个上部或下部字符,并在较小的问题(下一个字符)上递归调用算法。
你重复这一点,因为当前的信件是和不是大写的。


之前的代码失败了,因为你打印了每个字母更改后生成的字符串,这导致了更多(几乎是两倍)所有2^n 1 打印单词的方法。


(1)奖励:您可以打印正确的2^n个字符串,因为您需要选择的每个字符:是否大写?您为每个字符重复此问题,并从rule of product - 它为您提供了2^n个可能的字符串。

答案 1 :(得分:1)

看看这段代码:

System.out.println(caplet);
System.out.println(a);
capitalizer(caplet,b-1);
capitalizer(a,b-1);

您打印字符串的当前版本,然后再次处理它们。但是,当进一步处理时,不会发生任何更改。然而,在每次迭代中,您仍然会打印相同的字符串。

您要做的是删除这些打印件,并在最后(在if(b==-1)块中)添加打印件,在此处打印您在此时完成的特定迭代集的最终结果。

答案 2 :(得分:1)

你的递归函数应该操纵它给出的单词的第一个字母,并依赖递归调用来操纵剩余的字母。当您必须迭代复合对象的所有可能状态时,这是一个非常常见的问题。

这不会编译,但(我认为)这里是伪代码的解决方案:

recursion(word){

List list = new List();

String firstLetter = firstLetter(word);
String restOfWord = restOfWord(word);

for( rest : recursion(restOfWord)){
list.append(firstLetter.uppercase()+rest);
list.append(firstLetter.lowercase()+rest);

return list;
}

答案 3 :(得分:0)

在递归思考时,请考虑重复步骤。

考虑到最后一封信,你有:

OWNAGE OWNAGE

回过头来:

OWNAGE OWNAGE OWNAGE OWNAGE

请参阅?对于倒数第二个字母的每个替代项,您有最后一个字母的替代值。等等。

因此,考虑一下'如果我有前n个字母的所有替代品,那么我如何根据下一个字母获得替代品?

考虑如何解决这个问题,你会得到一个递归的解决方案。

答案 4 :(得分:0)

public static void capitalizer(String input) {
    capitalizer("", input);
}

private static void capitalizer(String prefix, String buffer) {
    if (buffer.isEmpty()) {
        System.out.println(prefix);
        return;
    }

    char c = buffer.charAt(0);
    char cup = Character.toUpperCase(c);

    String p = prefix + c;
    String pup = prefix + cup;

    String b = buffer.length() == 0 ? "" : buffer.substring(1, buffer.length());

    capitalizer(p, b);
    capitalizer(pup, b);
}

public static void main(String[] args) {
    capitalizer("ownage");
}

输出,

ownage
ownagE
ownaGe
ownaGE
ownAge
ownAgE
ownAGe
ownAGE
owNage
owNagE
owNaGe
owNaGE
owNAge
owNAgE
owNAGe
owNAGE
oWnage
oWnagE
oWnaGe
oWnaGE
oWnAge
oWnAgE
oWnAGe
oWnAGE
oWNage
oWNagE
oWNaGe
oWNaGE
oWNAge
oWNAgE
oWNAGe
oWNAGE
Ownage
OwnagE
OwnaGe
OwnaGE
OwnAge
OwnAgE
OwnAGe
OwnAGE
OwNage
OwNagE
OwNaGe
OwNaGE
OwNAge
OwNAgE
OwNAGe
OwNAGE
OWnage
OWnagE
OWnaGe
OWnaGE
OWnAge
OWnAgE
OWnAGe
OWnAGE
OWNage
OWNagE
OWNaGe
OWNaGE
OWNAge
OWNAgE
OWNAGe
OWNAGE