如果一个方法调用一个方法调用,如果它的参数称为tail递归吗?

时间:2015-09-29 22:20:38

标签: java definition tail-recursion

我正在研究尾部递归,我不确定我是否正确定义。

我看到这篇文章的最佳答案(link)   并且我想知道方法 sum(int x,int num)在以下示例中是否被认为是尾递归的:

public class tailrecusiontest {

    private static int total;

    private static int add(int num)
    {
        total+=num;
        return total;
    }

    public static int sum(int x, int num) //THIS METHOD TAIL-RECURSIVE?
    {
        if(num == 0)
        {
            return x;
        }

        return sum(add(num), num-1);
    }


    public static void main(String[] args) {
        System.out.print("" + sum(0,4));
    }
}
是的:什么阻止我创建一个对象并调用一个方法(在我的例子中为 add(int num)),它将处理数据,返回输出,按照定义,将其称为方法 tail-recursive

我问这个问题是因为一个赋值问我是否可以创建一个“尾递归”方法,并想知道尾递归的定义有多远。

这意味着我可以创建任何方法并传入值,然后将其称为tail-recursive

2 个答案:

答案 0 :(得分:3)

您的方法符合尾递归的定义,但Java本身没有尾递归优化。这意味着你仍然会有一个N尺寸的堆栈并逐一返回。

答案 1 :(得分:1)

简单来说,尾递归是一种递归,其中递归调用是函数中的最后一条指令。

基于这个简单的定义,您的示例代码是尾递归的,因为递归调用是最后一条指令。

那就是说,这个问题感觉就像一个副本,因为你基本上都在询问尾递归是什么,SO上的几个帖子对此做了正确的判断。有关尾递归的进一步阅读,请参阅'What is tail recursion'