【问题标题】:Problems with recursion in JavaJava中的递归问题
【发布时间】:2020-04-21 16:32:44
【问题描述】:

我正在尝试解决 Java 中的递归问题,但我坚持这个问题。我要把问题放在这里,我做了什么。感谢您的帮助:D

发现了一种新型病毒,一家公司要求我们编写一个公式,使我们能够找出特定时间该病毒的种群增长情况。最初,在时间 0 (h),我们有 32 个病毒,每小时病毒数量翻倍。此外,每小时添加固定数量的病毒 (num)。

a) 执行递归函数,计算一个小时内给定的病毒总数和给定病毒的固定数字。

b) 计算在 0、1 和 2 小时我们将拥有的病毒数量,固定数量为 10。

这就是我所做的:

public static void main (String [] Args) {
    Scanner in = new Scanner(System.in);
    int h, v, f, result;
    f = 10;
    v = 32;
    System.out.println("Hours: ");
    h = in.nextInt();
   result =  TotalVirus (h, v, f);
    System.out.println("Total : " + result);
}

public static int TotalVirus (int h, int v, int f) {
    int counter = 1, result;

    if ( counter == h) {
        return 1;
    }
    else {
      counter = counter + 1;
      v = v + 32 + f;
      result = TotalVirus(h,v,f);  

    }
    return result;

}

}

我真的不知道在 if 语句上写什么来结束递归。

【问题讨论】:

  • 你在哪里定义counter
  • 你的变量名混合了葡萄牙语和英语,请修正它以便这里的人能够理解。 @QBrute countercontador
  • 我刚刚修好了,抱歉,我是用西班牙语修的,所以它是混合的
  • 不是每次调用递归方法totalVirus时计数器都设置为零吗?方法名称应以小写字符开头。
  • 没错,我现在将计数器设置为 1,但我仍然输给了 if 语句来完成递归。

标签: java recursion


【解决方案1】:

按如下方式进行:

import java.util.Scanner;

public class Main {
    public static void main(String[] Args) {
        Scanner in = new Scanner(System.in);
        int h, v, f, result;
        f = 10;
        v = 32;
        System.out.println("Hours: ");
        h = in.nextInt();
        result = TotalVirus(h, v, f);
        System.out.println("Total : " + result);
    }

    public static int TotalVirus(int h, int v, int f) {
        if (h == 0) {
            return v;
        }
        return TotalVirus(h - 1, 2 * v + f, f);
    }
}

示例运行:

Hours: 
0
Total : 32

另一个示例运行:

Hours: 
1
Total : 74

另一个示例运行:

Hours: 
2
Total : 158

【讨论】:

  • 这段代码不会使每小时传播的病毒数量增加一倍。
  • SomeDude - 解决方案主要是帮助@Exos 在哪里/如何放置if 终止条件。他/她有能力进行计算部分,他/她可以根据需要进行调整。
【解决方案2】:

您只需要一个尾递归函数,如下所示:

public static int totalVirus (int h, int v, int f) {

    if ( h == 0 ) {
      return v;
    } 
    return totalVirus( h-1, 2*v + f, f );


}

所以你从一个小时开始,比如说h = 2,然后在每次通话中减少它。在递减的同时添加2*v + f,因为每小时病毒会翻倍并且还会添加固定数量。 当小时到达0 时,您只需返回现有的病毒数量。

【讨论】:

  • 谢谢!现在我明白了,我迷失在返回声明中,但现在很明显。当你看到它完成时它看起来多么容易哈哈:)
猜你喜欢
  • 2011-08-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
相关资源
最近更新 更多