2014-09-05 64 views
0

我需要指导理解递归。查看数组方法

以下是我有:

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循环会打败这个目的,但我想不出有任何其他的方式来做到这一点。任何帮助,将不胜感激。

+2

一个问题是,即使你找到的位置'i'的元素,你覆盖'str'与'不'当位置'i + 1'有不同的元素时。尝试从循环中“断开”,一旦找到该值,或者默认将'str'初始化为'No',并且只在循环中将其设置为'Yes',但不回到'No'。 – 2014-09-05 22:14:44

+0

@tobias_k你能解释我如何覆盖str吗?不应该是str + str + ...等等吗?每个str保存在该迭代期间分配的字符串,然后连接。默认情况下将str设置为“No”确实有助于顺便说一句。 – cress 2014-09-05 22:22:57

回答

3

有两个问题与您的代码:

  1. 通过在循环的每次迭代设置str,即使你找到的元素i位置,您覆盖str"No"当存在不同的元素位置i+1,有效地将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) 
+0

非常感谢,我得到它的工作!这非常有帮助。我想我可以说我现在理解递归更好。 – cress 2014-09-05 22:56:03