递归java函数,以重复单词“ computing”的开头和结尾

问题描述 投票:0回答:2

我不能使用全局变量,辅助方法或任何循环对答案不感兴趣,但指导会很棒。

当前正在打印控制台:

compcompcompcomputingtingting

但必须是:

计算计算compcompcomputingtingtingcompcompcompcomputingtingting

public static String madComputing(int n) {
    if (n < 0)
        return "Must be postive integer";// printing to present error instead getting error in console
    if (n > 1000)// avoid overflow
        return "Cannot be greater than 1000";

    if (n > 0) {
        //System.out.print("computing");
        return "comp" + madComputing(n - 1) + "ting" ;
    } else
        return "u";
}
java recursion
2个回答
0
投票

您可以添加一个额外的参数作为累加器,并将初始参数指定为“计算”。在您的示例案例中,将其称为madComputing(4,“ computing”)。

在代码方面看似很糟糕,但仍然可以完成工作:

public static String madComputing(int n, String acc) {
  if (n < 0) {
      return "Must be postive integer";
  }
  if (n > 1000) {
      return "Cannot be greater than 1000"; 
  }   
  if (n > 0) {
      System.out.println(acc);
      acc = "comp" + acc + "ting";
      return madComputing(n - 1, acc);
  } else {
    return ""; 
  }  
}

或者如果您不能添加累加器:

public static String madComputing(int n) {
  if (n < 0) {
      return "Must be postive integer";
  }
  if (n > 1000) {
      return "Cannot be greater than 1000"; 
  }   
  if (n >= 0) {
      String value = "comp" + (n == 0 ? "u" : madComputing(n - 1))+ "ting";
      System.out.println(value);      
      return value;
  } 
  return null;
}

0
投票

我将尝试向您解释这一点,而不是给您快速的答案。看来您的基本情况都正确,并且可以通过一些小调整来解决问题:

[我认为您的代码的主要问题是您没有在每个递归调用中打印/创建新的输出-每次都将递归调用简单地追加到相同的字符串。您可以告诉您需要在每个递归调用中打印一些内容,因为您的理想输出不仅显示最终的字符串,而且还显示它们之间的增量。

因此,在每个递归调用中,您都将打印结果到目前为止,然后将该中间结果传递给下一个递归调用。这意味着您的方法需要采用一个参数(或2),这将是到目前为止的结果(累加器)

现在的问题是,中间结果是什么样子?这将是在每个输出之间更改的东西,即“ u”之前的“ comp”和之后的“ tings”。因此,您可以传递一个'before'和'after'字符串参数(在第一次调用时将是空字符串),该参数到目前为止包含'comp'和'ting'的字符串。

然后在每个调用中,您只需要在before字符串上添加一个'comp',在after之后的字符串上添加一个'ting',然后在整个字符串中间打印一个'u'(before +'u'+ after ),然后将new在字符串前后传递给递归调用

进一步澄清后编辑:在没有累加器的情况下进行编辑

如果您需要在没有累加器的情况下完成此操作,则要复杂一些:

  1. 基本情况需要是“计算”而不是“ u”
  2. 对于非基本情况,首先进行递归调用(即使用n-1调用方法,并将其存储为字符串(例如recc_result)] >>
  3. 用换行符\n分割递归结果,并从中得到最后一行。可以使用recc_result.split()完成,然后获取数组的最后一个元素。叫这个last_line
  4. 最后,返回recc_result + '\n' + 'comp' + last_line + 'ting'
  5. 说明:

基本大小写的变化是因为您要在n = 1而不是“ u”时打印“ computing”。

其余部分的处理方法是,在每个阶段,您要从结果中获取最后一行,并在前面添加“ comp”,在末尾添加“ ting”,然后将其附加到结果。

因此基本情况是“计算”。然后对于n = 2,我们得到n-1(即1)的递归结果,这将为我们提供“计算”。此结果的最后一行是唯一一行(即“计算”)。然后,我们添加一个“ comp”和一个“ ting”,并将其附加到整个结果上,从而得到“ computing \ ncompcomputingting”。

对于n = 3,recc_result是“ computing \ ncompcomputingting”,从中取最后一行(“ compcomputingting”),然后添加一个comp并进行“ compcompcomputingtingting”并将其附加到整个结果上,从而得出“ computing \ ncomputingting” \ ncompcompcomputingtingting“

注意:\n =换行符>>

© www.soinside.com 2019 - 2024. All rights reserved.