繁体   English   中英

以布尔值作为返回值对数字进行计数的递归方法

[英]Recursive method to count figures in a number with boolean as return

我最近在大学里进行了考试,但一直在努力解决问题。 该任务的定义非常具体,如下所示:

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

签名和参数:

public static boolean oddZeros(int n) {
}

因此对于:

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

你明白了..

我了解递归的概念,但仅给定布尔值,我看不到如何计数。 我尝试在方法中添加一个计数器变量,但是每当我进行递归调用时,显然该变量将被重置为其初始化。

由于这是一个非常具体的问题,所以到目前为止我还没有找到任何解决方案。 这样的方法看起来如何?

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. 如果您从具有零个奇数的数字中删除一个0位数,则所得的(较小的)数字将不会具有零个奇数。

  2. 如果从奇数为零的数字中删除非0位数,则所得的(较小的)数字也将为奇数零。

最后,作为递归的基础,如果0 <number <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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM