使用递归方法计算数字位数

时间:2016-03-22 13:30:59

标签: java recursion

给定非负int n,递归计算(无循环) 8的出现次数作为一个数字,除了8与另一个8紧邻其左边计数加倍,所以8818收益率4.注意,mod(%)乘以10得到最右边的数字(126%10是6),而除(10)除去最右边的数字(126/10是12)。

count8(8) → 1
count8(818) → 2
count8(8818) → 4

我的节目似乎无法计算双倍的8。这是代码。

public int count8(int n) {
    boolean flag = false;
    if(n<10)
    {
      if (n==8)
      {
         if(flag == true)
             return 2;
         else 
         { 
             flag = true;
             return 1;
         }
      }
      else 
      {
        flag = false;
        return 0;
      }
    }

    else
       return count8(n%10)+count8(n/10);

}

我想知道最后一行是否出错,但我不知道如何检查。期待您的帮助。谢谢!

4 个答案:

答案 0 :(得分:1)

状态(前一个数字 8 )传递给方法:

private static int count8(int n, boolean eight) {
  if (n <= 0)
    return 0;
  else if (n % 10 == 8)
    return 1 + (eight ? 1 : 0) + count8(n / 10, true);
  else
    return count8(n / 10, false);
}

public static int count8(int n) {
  return count8(n, false);
}

答案 1 :(得分:1)

您的标志变量仅为本地变量。只有一次你阅读它:if (flag == true)并且因为在此之前你永远不会改变它的值,它总是错误的。

你使这比现在复杂得多。根本不需要额外的参数。

public int count8(int n)
{
    if (n % 100 == 88) return count8(n/10) + 2;
    if (n % 10 == 8) return count8(n/10) + 1;
    if (n < 10) return 0;
    return count8(n/10);
}

答案 2 :(得分:0)

你可以尝试这样的smth:

public int count8(int n) {
    if (n < 10)
        return n == 8: 1 ? 0;

    int count = 0;
    String num = Integer.toString(n);
    int numLength = num.length();

    if (numLength % 2 != 0)
        num += "0";

    if ((num.charAt(numLength / 2) == num.charAt(numLength / 2 - 1)) && (num.charAt(numLength / 2) == "8"))
        count++;

    String left = num.substring(0, numLength / 2);
    int leftInt = Integer.parseInt(left);
    String rigth = num.substring(numLength / 2);
    int rigthInt = Integer.parseInt(rigth);

    return count + count8(leftInt) + count8(rigthInt);
}

答案 3 :(得分:0)

C ++

int count8(int n) {
    return n == 0 ? 0 : (n % 10 == 8) + (n % 100 == 88) + count8(n/10);
}

Java和C#

int count8(int n) {
    if (n==0) return 0;
    if(n % 100 == 88)
        return 2 + count8(n / 10);
    if(n % 10 == 8)
        return 1 + count8(n / 10);

    return count8(n / 10);
}