使用布尔值作为返回值

时间:2018-02-14 14:31:29

标签: java recursion boolean counter

我最近在大学接受考试,但我遇到了一个问题。该任务的具体定义如下:

写一个递归方法(不要更改签名或参数;不允许全局变量;不要使用字符串或方法Stringbuffer;没有循环)如果零的数量为0则返回“true”数字“n”为奇数,如果零数为偶数则为“假”。

签名和参数:

public static boolean oddZeros(int n) {
}

所以:

n = 10 //true
n = 100 //false
n = 1402050 //true
n = 0 // true
n = 12 // false

你明白了......

我理解递归的概念,但我没有看到我如何计算某些东西,只给出了布尔值。我尝试在方法中添加一个计数器变量,但每当我进行递归调用时,显然该变量将被重置为其初始化。

由于这是一个非常具体的问题,到目前为止我没有找到任何解决方案。这样的方法怎么样?

2 个答案:

答案 0 :(得分:3)

public static boolean oddZeroes(int n) {
  if (n < 10) {
    return n == 0;
  }
  return (n % 10 == 0) ^ oddZeroes(n / 10);
}

你甚至可以单行:

public static boolean oddZeroes(int n) {
  return n < 10 ? n == 0 : (n % 10 == 0) ^ oddZeroes(n / 10);
}

如果你想处理负输入,在开头添加if (n < 0) {return oddZeroes(-n);}之类的东西,即:

public static boolean oddZeroes(int n) {
  if (n < 0) {
    return oddZeroes(-n);
  }
  if (n < 10) {
    return n == 0;
  }
  return (n % 10 == 0) ^ oddZeroes(n / 10);
}

答案 1 :(得分:3)

你不需要算什么。

你只需要注意:

  1. 如果从具有奇数个零的数字中删除0数字,则生成的(较小的)数字不会有奇数个零。

  2. 如果从具有奇数个零的数字中删除非0数字,则生成的(较小的)数字也会有奇数个零。

  3. 最后,作为递归的基础,如果0&lt;数字&lt; 10,它具有偶数个0 s(0 0 s),因此您的方法应返回false

    您可以编写较短的实现,但我更喜欢可读性:

    public static boolean oddZeros(int n) {
        if (n == 0)
             return true;
        else if (n < 10)
            return false;
        else if (oddZeros (n / 10)) {
            return n % 10 != 0; // removed digit is not 0
        } else {
            return n % 10 == 0; // removed digit is 0
        }
    }
    

    编辑:

    这假设输入是非负的。如果需要支持负输入,可以添加初始条件:

    if (n < 0) {
        return oddZeros (-n);
    }