【问题标题】:counting recursive calls WITHOUT variables [closed]计算没有变量的递归调用[关闭]
【发布时间】:2012-10-06 18:31:55
【问题描述】:

是否可以在没有变量的情况下计算递归深度?

【问题讨论】:

  • “递归调用次数”是什么意思?
  • 让你的递归方法返回语句本身就是递归计数
  • 如果没有counting,你怎么能数数??您将需要一个变量来存储计数..
  • 你的意思真的不清楚。你的意思是你不能使用作用域局部变量,全局变量?您可以在方法内部使用变量吗? (如果你做不到,这简直是不可能做到的。)
  • 您的问题太模糊,无法给出好的答案。谁想知道这个数字?原始调用者还是函数本身? “递归调用次数”是调用方法的次数还是递归的深度?方法签名是什么样的?你能改变它的参数或返回类型吗?您可以指定什么样的变量?您可以只指定局部变量,还是根本不指定变量?你基本上没有给我们任何东西。

标签: java


【解决方案1】:

你在寻找这样的东西吗?

public int foo(int count) {
    if (exitCondition) return count; 
    foo(count+1);
}

计算调用的其他方法将涉及反射或使用字节码修改库(即 AoP)。

【讨论】:

  • 它纯粹是功能性的,我想这个问题在细节上有点模糊。
  • @A.R.S 取决于您是否将方法参数计为“变量”。
【解决方案2】:

在java中,

Thread.currentThread().getStackTrace()

可用于确定调用深度。递归调用的次数就是栈长和第一帧位置的差。

或抛出异常,然后从最顶层的函数中检索堆栈:

Throwable.getStackTrace()

返回一个堆栈跟踪元素数组,每个元素代表一个堆栈帧。数组的第零个元素(假设数组的长度不为零)表示堆栈的顶部,这是序列中的最后一个方法调用。通常,这是这个 throwable 被创建和抛出的点。数组的最后一个元素(假设数组的长度不为零)代表栈底,也就是序列中的第一个方法调用。

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html

【讨论】:

    【解决方案3】:

    你的问题非常模糊,所以我做了几个假设:

    1. “递归调用次数”是指“递归深度”
    2. 函数的原始调用者想知道深度,所以递归方法返回它
    3. “无变量”意味着您甚至不能使用局部变量来跟踪深度

    因此,如果您使用某种随机方法并调用递归函数:

    public void randomMethod() {
        Something somethingToRecurseOn = ... ;
        int depth = recurse(somethingToRecurseOn);
    }
    

    这是我的解决方案的预期用途。这是recurse 方法:

    public int recurse(Something s) {
        Something subS = s.getSubS();
        if (subS == null) { // Exit condition
            return 1;
        }
        // Do something with subS
        return recurse(subS) + 1;
    }
    

    您将深度整合到函数的返回值中,并假设退出条件的深度为 1。

    这其实和我过去问过的一个面试问题有关,你必须在递归序列中返回元素的数量,签名是:

    public int collatz(int n)
    

    其中n 是您正在操作以查找序列的下一个数字的数字,该数字在 1 处停止。如果它是通过递归而不是迭代实现的,它本质上会返回递归深度。

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 2023-02-04
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多