【问题标题】:Recursive isMember method with only two arguments!只有两个参数的递归 isMember 方法!
【发布时间】:2011-09-13 00:42:09
【问题描述】:

我需要创建一个名为 isMemeber 的递归布尔方法。该方法应该只接受两个参数:一个数组和一个值。如果在数组中找到该值,则该方法应返回 true,如果在数组中未找到该值,则该方法应返回 false。

我认为基本情况是传递的数组为空,但我需要递归情况的帮助:

public static boolean isMember(int[] array, int value)
{
    if(array.length==0){
        return false; 
    }else{
        return isMember(???);           
    }
}

这是使用位置变量时的样子:

public static boolean isMember(int[] array, int value, int position)
{
    if (position > -1)
    {

        if (array[position] == value)
        {
            return true;
        }
        else
        {
            return isMember(array, value, position - 1);
        }
    }
    return false;

}

【问题讨论】:

  • 为什么需要递归?如果是作业,请标记它。
  • 是的,这是一个家庭作业。你有什么解决办法吗?
  • 我没有看到递归方面,因为数组参数是一个平面数组;没有深度或子成员。
  • 肯定不打算使用涉及复制全部或部分数组的解决方案? (它在某些语言中是惯用的,但在 Java 中不是。)
  • 我知道在这种情况下使用递归是无效的,但这个练习是 Tony Gaddis 的“从 Java 开始,早期对象”中递归章节的一部分(第 938 页,前 2)。

标签: java arrays recursion boolean


【解决方案1】:

如果您需要使用递归,您可以在每次递归时复制数组。这是低效的,但与使用循环相比,使用递归是低效的。例如Arrays.indexOf()

public static boolean isMember(int[] array, int value) {
    if(array.length == 0) return false; 
    if(array[0] == value) return true;
    int[] array2 = new int[array.length-1];
    System.arraycopy(array,1,array2,0,array2.length);
    return isMember(array2, value);           
}

【讨论】:

  • 这是非常聪明的解决方案,先生。谢谢你的回答!
  • 具有讽刺意味的是,arraycopy 将在其实现中使用循环。 ;)
  • 哇...是的,这是递归的。唯一的问题是您提供了 OP teh codez,我们不应该为家庭作业这样做;)
  • @IAbstract,通常我会同意,除非有些问题是人为的,以至于试图自己解决它并不容易。我知道这种方法是从函数式编程中翻译过来的。 OP 本可以对其他类型的语言如何做到这一点进行更多研究,但对于初学者恕我直言,这是很多问题。
  • 确实如此......不过答案很好!
【解决方案2】:

您的问题有一个小问题。如果要使用递归,那么每个数组元素都需要有一个子元素,否则为什么要传递给递归方法?如果这不是 casr 并且情况如您所说,那么用递归解决这个问题是不合适的。你也错过了价值比较。

【讨论】:

    【解决方案3】:

    请参阅MSDN Array class。这看起来像是c#。不妨试试Array.Find<T> 方法。

    更新:
    对于 Java,我建议查看 Arrays (Java 2 Platform):

    二进制搜索

    public static int binarySearch(int[] 一种, 整数键)

    使用二进制搜索算法在指定的整数数组中搜索指定值。在进行此调用之前,必须对数组进行排序(如上面的排序方法)。如果 它没有排序,结果是 不明确的。如果数组包含 具有指定的多个元素 值,不能保证是哪一个 会被发现的。

    Parameters:
        a - the array to be searched.
        key - the value to be searched for. 
    Returns:
        index of the search key, if it is contained in the list; otherwise,> (-(insertion point) - 1). 
    

    插入点定义为键将被插入列表的点:第一个元素的索引大于键,或者 list.size(),如果所有元素 列表中的值小于指定的键。请注意,这保证了当且仅当找到键时,返回值将 >= 0。另请参阅:排序(int[])

    【讨论】:

      【解决方案4】:

      如果这是家庭作业并且他们希望它是递归的,那么也许你应该:

      1 查找数组的中间值并检查它是否匹配。如果匹配,则返回 true

      2 将函数应用于数组的前半部分。如果返回true,则返回true

      3 将函数应用于数组的后半部分。如果返回true,则返回true

      4 返回假

      没有代码,因为这是家庭作业。


      编辑:数组是否有序?

      【讨论】:

      • 该方法不能包含任何索引元素。您的建议不会要求索引元素到达中间吗?当@DaTribe 说没有子集元素时,我不知道这将如何递归。
      • 他必须将数组复制到正确大小的新数组中。是的,非常低效,但这是功课(使用递归解决这个问题也非常低效)。
      【解决方案5】:

      我只是在做这个问题,并检查其他方法的答案。当您必须将名称与字符串数组匹配时,这可能会很有用。

      public class Recursion {
      
          public static void main(String[] args) {
              String[] array = {"Tom", "Mary"};
              if(isMember(array,"John"))
                  System.out.print("Found!");
              else
                  System.out.println("Not Found!");
      
          }
      
          public static boolean isMember(String[] array, String name)
          {   
              int i = array.length;
              if(array.length == 0)
                  return false;
              if(array[i - 1].equals(name))
                  return true;
              else
              {
                  String[] array2 = new String[array.length - 1];
                  for(int b = 0; b< array.length -1; b++)
                  {
                      array2[b] = array[b];
                  }
                  return isMember(array2, name);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        相关资源
        最近更新 更多