【问题标题】:Looking in array method查看数组方法
【发布时间】:2014-09-05 22:10:26
【问题描述】:

我在理解递归方面需要指导。

这是我所拥有的:

public class ArrayMember
{
    public static void main(String[] args)
    {
        int index = 0;
        int [] arr = {1, 5, 6, 2};

        System.out.println(member(arr, index));
    }

    public static String member(int [] arr, int index)
    {
        if(index == arr.length)
            return str;

        str = index + "\t" + str + "\n";

        return str + member(arr, index+1);
    }
}

如您所见,这永远不会一直到 20 并且总是打印“否”。而且我很确定有一个 for 循环会破坏目的,但我想不出任何其他方法来做到这一点。任何帮助将不胜感激。

【问题讨论】:

  • 一个问题是,即使你在i 位置找到了元素,当i+1 位置有不同的元素时,你会用No 覆盖str。找到值后尝试从循环中break,或默认将str初始化为No,并且仅在循环中将其设置为Yes,而不是返回No
  • @tobias_k 你能解释一下我是如何覆盖 str 的吗?它不应该是str + str + ...等吗?每个 str 保存在该迭代期间分配的 String 然后连接。默认情况下将 str 设置为“否”确实有帮助。

标签: java arrays recursion


【解决方案1】:

你的代码有两个问题:

  1. 通过在循环的每次迭代中设置str,即使在i 位置找到元素,当i+1 位置有不同的元素时,str 也会被"No" 覆盖,从而有效地设置str 判断元素是否是数组中的最后一个元素。找到值后尝试从循环中break,或默认将str 初始化为"No",如果找到则仅将其设置为"Yes"
  2. 通过检查index == arr.length,您并未测试从 1 到 20 的所有数字。您可以改为检查 index > arr[arr.length-1],即检查它是否大于列表中的最后一个元素,但这仅适用于列表已排序。

这应该可以修复您的代码。但是,老实说,我认为您对作业有一点误解(尽管我不得不承认,从一开始就不是很清楚)。而不是使用递归来测试后续数字(问题是你真的不知道何时停止),并使用循环来测试数组的不同位置,我会反转它:使用循环来测试不同的数字您想要测试,并对数组中的不同位置使用递归。

这样,你可以将你的程序简化成这样(伪代码):

function member(arr, num, index) -> bool :
    if index does not exceed array
        return arr[index] equals num or member(arr, num, index+1)
    else 
        return false

arr = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
for i from 1 to 20
    print i, member(arr, i, 0)

【讨论】:

  • 非常感谢,我成功了!这非常有帮助。我想我可以说我现在更好地理解了递归。
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 2011-12-08
相关资源
最近更新 更多