任何图表或方法都可以帮助更好地理解和构造递归方法吗?

时间:2015-11-10 14:50:48

标签: recursion

我认为很难全面了解它是如何运作的。我读了几个递归方法,经过一点点递归后我迷路了。这就是为什么我问你怎么理解一个递归方法。是否有任何分析方法可以帮助解决这个问题,比如图表或什么?

例如,如下所示,简单的二进制搜索示例有很多条件,很难想象在递归的几个步骤之后它是如何进行的。

public class FindIndexBS<Item extends Comparable<Item>> {
    private Item[] arr;

    public FindIndexBS(Object[] arr) {
        this.arr = (Item[]) arr;
    }

    public int solve(Item item) {
        int lo = 0, hi = arr.length - 1;
        return solve(lo, hi, item);
    }

    private Integer solve(int lo, int hi, Item item) {
        if (lo > hi) return -1;
        int mid = lo + (hi - lo) / 2;
        int cpm = item.compareTo(arr[mid]);

        if (cpm < 0) return solve(lo, mid - 1, item);
        else if (cpm > 0) return solve(mid + 1, hi, item);
        else return mid;
    }

    public static void main(String[] args) {
        Integer[] arr = new Integer[100];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i * 1;
        }
        FindIndexBS<Integer> bs = new FindIndexBS<Integer>(arr);
        System.out.println("index of the number is: " + bs.solve(40));
    }
}

Adarsh Bhat的方法可以很好地展示它的运作方式。但我不知道如何将该方法应用于二进制搜索等更复杂的方法。

2 个答案:

答案 0 :(得分:1)

让我先从Recursion的定义开始:

  

递归是根据自身定义某事物的过程。如   它涉及到java编程,递归是允许的属性   一种自称的方法。据说自称为自己的方法   递归的。

现在让我们举一个递归方法的例子,例如“找到一个数字的因子”:

int fact(int n)
{
    int result;

   if(n==1)
     return 1;

   result = fact(n-1) * n;
   return result;
}

当我们使用递归时,堆栈的概念开始起作用,一旦操作达到常量就会弹出数据。

这里我们说我们传递一个数字5:

事实(2)=事实(1)* 2

事实(3)=事实(2)* 3

事实(4)=事实(3)* 4

fact(5)= fact(4)* 5&lt; ----------这首先调用你的方法。

这就是你的堆栈中的内容。由于fact(1)值为1.它开始计算,并且在每次计算之后它弹出该条目并将其提供给它下面的下一个等式。

我希望这有帮助:)

答案 1 :(得分:0)

递归与语言无关,它在所有语言中都是相同的概念。它只是意味着“自称”。 Java中的一个例子:

public int getNumber(int low){
  low += 5;
  if ( low < 100 ){
    return getNumber(low); // REC
    }
   return low;
}

我添加REC注释的行是方法实际调用自身的行(递归)。