当前位置: 首页 > 面试题库 >

有没有一段时间您不使用递归?

端木皓君
2023-03-14
问题内容

我有一个大学实验室的问题;

编写一个简短的程序,输出使用字符“ c”,“ a”,“ r”,“ b”,“ o”和“ n”恰好一次形成的所有可能的字符串。

这似乎是一个常见的面试问题,并且有据可查。

因此,我使用递归方法用Java对其进行了编码,这种方法并不难, 何时或为何选择不使用递归,最简单的方法是什么?

我开始编写一个计数器,该计数器将从6开始递减计数,然后输出将引用char并打印字符串。

谢谢,


问题答案:

是的,很多时候我不会使用递归。递归 不是
免费的,它在堆栈空间上有成本,并且与其他资源相比,资源通常更为有限。设置和拆卸堆栈框架也要花费时间,无论多么小。

举例来说,倍受吹捧的阶乘函数就是我可能会选择一种迭代方法的函数,该函数的数目很大。计算10000!与:

def factorial (n):
    if n = 1 return 1
    return n * factorial (n-1)

将使用10,000个堆栈帧(假设编译器没有将其优化为迭代解决方案,当然)。迭代解决方案:

def factorial (n)
    r = 1
    while n > 1:
        r = r * n
        n = n - 1
    return r

将只使用一个堆栈框架,而很少使用其他框架。

的确,递归解决方案通常是更优雅的代码,但是您必须在环境的限制下加以调整。

您的carbon示例是我实际上将使用递归的示例,因为:

  • 它最多使用六个堆栈帧(字符串中每个字符一个);和
  • 它相对优雅,至少比六个嵌套循环和庞大的相等性检查要多得多。

例如,以下Python代码可以解决问题:

def recur (str, pref = ""):
    # Terminating condition.

    if str == "":
        print pref
        return

    # Rotate string so all letters get a chance to be first.

    for i in range (len (str)):
        recur (str[1:], pref + str[:1])
        str = str[1:] + str[:1]

recur ("abc")

生产:

abc
acb
bca
bac
cab
cba

当然,如果您的字符串可以是10K长,我会重新考虑一下,因为这将涉及更多的堆栈级别,但是,如果保持足够低,则递归是一个可行的解决方案。



 类似资料:
  • 我是Drools的新手。我需要用Spring启动构建一个应用程序 我正在使用一个“geofence\u rule.drl”文件来保存与地理位置相关的规则。 模型等级如下所示。 我可能会得到“n”个标签的位置相关数据,比如tag1、tag2、tag3等等。我需要计算tag1在过去5分钟内是否不在房间1中(这意味着tag-1的数据没有达到“房间1中tag位置的规则”)。Drools中是否支持这种计算?

  • 我想重置/删除所有条目从我的数据库的所有集合,在MongoDB的NodeJs一定的时间后。可能的方法是什么? 我已将此代码包含在函数中。也许有一种方法可以在一段时间后调用这个函数?

  • 我应该为依赖于的库的集成测试做出贡献,底层实现是用编写的。测试更倾向于流经一些属性的事件流。 以下存根是实际实现的一部分 现在,我要寻找的代码可能是 注意,我知道搜索。测试中的时间戳可以更新,但这需要在每个!! 但是有没有更好、更可靠的方法在规格2和/或scala中做到这一点? 编辑:我必须指出,我并不期待更改实现,以便用另一个类覆盖/包装。

  • 我的用例如下: 我创建了一个可观察的来访问远程服务器以获取一些数据。但是,由于服务器设计不完善,因此可能永远没有响应,也没有异常。为了解决这个问题,我希望有一些超时重试机制。 目前,我尝试启动一个计时器来停止请求,并在请求中抛出异常,然后重试,直到达到一定的尝试次数或实际超时。我试着使用操作符将请求与映射为使用,但是我无法在订阅服务器中捕获错误,它看起来像是可以观察到的永远不会结束。 对于RXJA

  • 错误[42883]错误:函数datediff(未知,没有时区的时间戳,没有时区的时间戳)不存在提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。职位:36

  • 移除任何具有匹配意图的警报。任何类型的警报,其意图与此匹配(由filterEquals(Intent)定义),都将被取消。 由于此应用程序设计为具有多个一次性警报,我想知道我的假设是,由于这些警报都来自由相同方法创建的相同基本意图,取消一个警报是否会取消所有警报。如果是的话,我该如何处理这件事呢?