【问题标题】:Is a method that has a method call in one if its parameters called tail recursive?如果其参数称为尾递归,则该方法是否具有方法调用?
【发布时间】:2015-09-29 22:20:38
【问题描述】:

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

我看到这个帖子的最佳答案(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

我问这个问题是因为一个作业问我是否可以使一个方法“尾递归”,并想知道尾递归的定义延伸到多远。

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

【问题讨论】:

  • 我认为你没有抓住重点;一个函数是否是尾递归并不取决于参数是什么,或者参数中的任何东西可能会做什么。
  • 如果有的话,您可以像对待 n - 1 一样对待 add(num) 以确定 sum 是否是尾递归的
  • 您链接的帖子中的第二个答案可能更有用。试试它的建议。

标签: java definition tail-recursion


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    也就是说,这个问题感觉像是重复的,因为您本质上是在问什么是尾递归,并且 SO 上的几篇文章对此进行了公正的处理。有关尾递归的进一步阅读,请参阅'What is tail recursion'

    【讨论】:

    • 如果您觉得帖子重复,我很抱歉。我看到了你链接的那篇文章,我只是不确定尾递归的定义是否还有其他限制,这在我阅读的所有帖子中都没有指定(它们都使用原始数据类型)。感谢您的澄清。
    • @JohnMadon1234567890 不用担心,很高兴您找到了问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2011-07-19
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2021-11-07
    • 2016-04-07
    相关资源
    最近更新 更多