当前位置: 首页 > 知识库问答 >
问题:

CodingBat计数数为8s递归[闭]

陆琦
2023-03-14

我在codingbat上做这个问题,我的解决方案没有通过那里的所有测试。问题是递归地返回给定数中8的数目。如果有两个连续的8,那么您必须添加一个额外的。(例如,818=>2;88=>3)我在这里复制了Python中的代码,它似乎可以工作。我的代码在下面。

boolean prev_was_8 = false;

public int count8(int n) {
  int count = 0;
  int original_n = n;
  n = n % 10;
  if (original_n == 0) {
    return 0;
  }
  if (n == 8) {
    count++;
    if (prev_was_8) {
      count++;
    }
    prev_was_8 = true;
  } else {
    prev_was_8 = false;
  }
  return count + count8(original_n / 10);
}

来自上面代码的测试结果:

共有1个答案

房学
2023-03-14

下面的代码给出了问题中所有测试用例的正确结果。
(代码后面的注释)

private static int count8(int n, int extra) {
    int count = 0;
    if (n % 10 == 8) {
        count = 1 + extra;
        extra = 1;
    }
    else {
        extra = 0;
    }
    if (n < 10) {
        return count;
    }
    else {
        return count + count8(n / 10, extra);
    }
}

为了满足一个8与另一个8紧靠其左侧计数加倍的要求,您要么需要一个类成员变量(就像您对变量prev_was_8所做的那样),要么向递归方法添加另一个参数。从上面的代码中可以看到,我选择添加一个额外的参数。

在递归方法中,首先需要确定终止条件,即if语句,该语句确定方法是否应该递归地调用自己。在上面的代码中,该条件是:

if (n < 10)

在递归方法中需要做的第二件事是使用不同的参数值调用该方法(一旦确定确实需要递归调用相同的方法)。在上面的代码中,我调用值为n除以10的方法。因此,对于每个递归调用,n的值较小。最终,n的值将小于10,当发生这种情况时,该方法将不调用自己,而是返回。

一旦方法返回,调用它的方法也会返回。每个方法调用都将其计数添加到从递归调用返回的计数中。最后,初始方法调用返回所需的计数。

这是方法count8的初始调用示例

count8(23884, 0)
 类似资料:
  • 下面是我正在尝试的代码: 我得到的错误是在我的字符串末尾多了一个字符。第一个示例将给出“chocchochcc”和第二个“chochcc”,等等。我只是想知道,从概念上来说,我做错了什么,以及如何修复它。

  • 首先,我应该说这是一个让我困惑的作业,我已经纠正了讲师的一个问题:/ 不管怎样,我已经做了一个方法,它使用布尔值、一个当循环和一个计数器来计算单词。 然而,我需要了解如何将其转化为一个递归方法,计算字符串中的单词数量,一个单词由一个或多个空格分隔。 正如您所看到的,唯一的参数是CountWords(String s,int i),使其更加困难。 此外,在该方法中,我仅限于使用这三种方法:s.cha

  • 定义一个接受1个参数的count_down函数。当你调用count_down(3)时,输出应该是这样的:3...2...1...0!。 我的代码如下: 但是输出是[3,2,1,0][4,3,2,1,0]如何获得如所讨论的格式所描述的格式:3...2...1...0!

  • 是否有一种方法可以编写递归函数,该函数打印数字中的位数,以便: -它是一个无效函数 -"if"条件是if(num==0),返回 -“else”将调用递归。 我看到了两种不同类型的代码,其中一种是“if”条件具有递归调用,另一种是用于“return”。但这不是我想要的。 我很不擅长递归,并试图通过自己编写代码来理解它,但没有成功。 这是我的代码(我明白为什么它打印122而不是3,但我真的不知道如何以

  • 我知道这个问题已经被问过很多次了,但是我的问题有点不同。这个任务要求我不验证一个字符串是否是回文——而是验证一个字符串中有多少回文(返回为“int”)。这应该使用迭代函数来完成 以下是我的迭代函数代码供参考: 我只是很难把它转换成递归函数。感谢所有帮助!

  • 问题 你想在一个函数中调用相同的函数。 解决方案 使用一个命名函数: ping = -> console.log "Pinged" setTimeout ping, 1000 若为未命名函数,则使用 @arguments.callee@: delay = 1000 setTimeout((-> console.log "Pinged" setTimeout arg