当前位置:  开发笔记 > 编程语言 > 正文

重构这个递归方法?

如何解决《重构这个递归方法?》经验,为你挑选了1个好方法。

我对递归的想法很新,这实际上是我第一次尝试编写递归方法.

我试图实现一个递归函数Max,它传递一个数组,以及一个保存数组大小的变量,以便打印出最大的元素.

它有效,但感觉不对劲!

我也注意到我似乎比一般的同学更多地使用静态修饰符......

任何人都可以提供任何一般提示以及如何改进我的代码的反馈?

public class RecursiveTry{

static int[] n = new int[] {1,2,4,3,3,32,100};
static int current = 0;
static int maxValue = 0;
static int SIZE = n.length;

public static void main(String[] args){
    System.out.println(Max(n, SIZE));
}   

public static int Max(int[] n, int SIZE) {
    if(current <= SIZE - 1){
        if (maxValue <= n[current]) {
            maxValue = n[current];
            current++;
            Max(n, SIZE);                       
        }
        else {
            current++;
            Max(n, SIZE);
        }
    }
    return maxValue;
}

}



1> Greg Hewgill..:

使用静态变量来保持函数外的状态将是一个困难的来源.

在伪代码中递归实现max()函数的示例可能是:

function Max(data, size) {
    assert(size > 0)
    if (size == 1) {
        return data[0]
    }
    maxtail = Max(data[1..size], size-1)
    if (data[0] > maxtail) {
        return data[0]
    } else {
        return maxtail
    }
}

这里的关键是对Max()的递归调用,在这里你传递第一个元素之外的所有东西,一个小于大小的东西.一般的想法是这个函数说"这个数据中的最大值是第一个元素,或者是数组其余部分中值的最大值,以较大者为准".

此实现不需要函数定义之外的静态数据.

递归实现的标志之一是所谓的"终止条件",它阻止递归永远继续(或者,直到你得到堆栈溢出).在上述情况下,测试size == 1是终止条件.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有