【问题标题】:Why is my return statement not working in this recursive function?为什么我的 return 语句在这个递归函数中不起作用?
【发布时间】:2022-01-21 01:47:03
【问题描述】:

我有一个数组,它只使用升序整数预先排序:

int[] intArray = new int[]{ 1,2,3,4,5,6,7,8,9 };

我希望我的程序在该数组中搜索一个整数,我将其称为“gesucht”,并返回数组中“gesucht”所在的位置。

我不能使用任何循环、包或类似 .find 方法的东西,必须使用递归

这是我的程序:

public static int optimierteSuche(int gesucht, int[] array, int startposition, int endposition){
    if((0<=startposition && startposition<=endposition && endposition<=array.length) == false){
        throw new IllegalArgumentException("wrong input");
    }
    int m = (endposition-startposition)/2;
    if (gesucht == array[m]){
        return m;
    }
    if (array[m]<gesucht){
        optimierteSuche(gesucht, array, m+1, endposition);
    } else {
        optimierteSuche(gesucht, array,startposition, m-1);
    }

}

当我在我的主要方法中使用以下内容时:

int[] intArray = new int[]{ 1,2,3,4,5,6,7,8,9 };
System.out.println(optimierteSuche(2,intArray,0,intArray.length));

我的编译器告诉我,我的方法缺少 return 语句,虽然它在那里,当我使用我的算法并自己计算步骤时它可以工作(或者至少我会说它可以)

我已经尝试过稍微调整一下,但也没有用:

public static int optimierteSuche(int gesucht, int[] array, int startposition, int endposition){
        if((0<=startposition && startposition<=endposition && endposition<=array.length) == false){
            throw new IllegalArgumentException("wrong input");
        }
        int m = (endposition-startposition)/2;
        int ergebnis = 0;
        if (gesucht == array[m]){
            ergebnis = m;
        }
        if (array[m]<gesucht){
            optimierteSuche(gesucht, array, m+1, endposition);
        } else {
            optimierteSuche(gesucht, array,startposition, m-1);
        }
        return ergebnis;
    }

我因为兴趣而学习经济学并参加了一些编程课程,但因此与许多其他编程专业的联系并不多,并且希望得到一些帮助。谢谢!

【问题讨论】:

  • 如果gesucht == array[m] 为假,则没有返回语句。
  • 你需要从你的递归optimierteSuche调用中返回值,即return optimierteSuche(...)
  • 多么愚蠢的错误!不过我现在明白了,谢谢!

标签: java arrays recursion return tail-recursion


【解决方案1】:

我认为您想将 ergebnis 设置为等于您对 optimierteSuche 的两次调用的返回值,并修复您对中间位置的计算,并再添加一个“else”,使其看起来像这样:

public static int optimierteSuche(int gesucht, int[] array, int startposition, int endposition){
        if((0<=startposition && startposition<=endposition && endposition<=array.length) == false){
            throw new IllegalArgumentException("wrong input");
        }
        int m = startposition + ((endposition-startposition)/2);
        int ergebnis = 0;
        if (gesucht == array[m]){
            ergebnis = m;
        }
        else
        if (array[m]<gesucht){
            ergebnis=optimierteSuche(gesucht, array, m+1, endposition);
        } else {
            ergebnis=optimierteSuche(gesucht, array,startposition, m-1);
        }
        return ergebnis;
    }

你快到了!

【讨论】:

    【解决方案2】:

    tgdevies 是正确的,感谢他们,但因为 cmets 并不总是表达需要发生的事情......

    public static int optimierteSuche(int gesucht, int[] array, int startposition, int endposition) {
        if ((0 <= startposition && startposition <= endposition && endposition <= array.length) == false) {
            throw new IllegalArgumentException("wrong input");
        }
        int m = startposition + ((endposition - startposition) / 2);
        if (gesucht == array[m]) {
            return m;
        }
        if (array[m] < gesucht) {
            return optimierteSuche(gesucht, array, m + 1, endposition);
        }
        return optimierteSuche(gesucht, array, startposition, m - 1);
    }
    

    可运行示例

    public class OtherTest {
    
        public static void main(String[] args) {
            int[] intArray = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
            System.out.println(optimierteSuche(2, intArray, 0, intArray.length));
            intArray = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            System.out.println(optimierteSuche(2, intArray, 0, intArray.length));
        }
    
        public static int optimierteSuche(int gesucht, int[] array, int startposition, int endposition) {
            if ((0 <= startposition && startposition <= endposition && endposition <= array.length) == false) {
                throw new IllegalArgumentException("wrong input");
            }
            int m = startposition + ((endposition - startposition) / 2);
            if (gesucht == array[m]) {
                return m;
            }
            if (array[m] < gesucht) {
                return optimierteSuche(gesucht, array, m + 1, endposition);
            }
            return optimierteSuche(gesucht, array, startposition, m - 1);
        }
    }
    

    【讨论】:

    • 当我创建数组 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } 我得到 StackOverflow 错误
    • @RichardKYu - 未正确计算中间位置 (m)。
    • @RichardKYu 您需要调试代码才能找出原因。我认为这两个答案的组合就是你所追求的
    • 是的。我也明白了。我做了 m = (endposition - startposition) / 2 + startposition;
    • @user16320675 startposition + ((endposition - startposition) / 2) 有效,(endposition-startposition)/2 无效-据我所知,这是延伸的;)。我也不是试图“优化”解决方案,我试图在正确的方向上“刺激” OP 以解决他们眼前的问题;)
    猜你喜欢
    • 2018-04-05
    • 2019-10-29
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多