当前位置: 首页 > 知识库问答 >
问题:

函数的尾递归

芮叶秋
2023-03-14

我有一个家庭作业问题,它给出了一个递归函数,我必须使用尾部递归来实现它。函数为f(0)=1
f(n)=1 2*f(n-1)

我并不擅长尾部递归,我试着查找示例,但我发现的都是没有斐波那契序列的示例,这没有多大帮助。

我真正拥有的是

def f(n,s=1):
    if n == 0:
        return s
    else:
        return f(n-1, "i dont know what to put here")

我知道尾递归基本上每次调用都计算函数,我只是不知道如何实现它。
编辑:我打了一个错字f(n)应该是1 2*f(n-1)

共有1个答案

羊舌赞
2023-03-14

对于尾部递归,您可以边走边跟踪总和:

$ cat foo.py 
import sys

def f(n,s=1):
    if n == 0:
        return s
    return f(n-1, 1+2*s)

r = int(sys.argv[1])
print(f(r))

输出:

$ seq 0 10 | xargs -I% python foo.py %
1
3
7
15
31
63
127
255
511
1023
2047
 类似资料:
  • 各种各样的书籍、文章、博客帖子表明,将递归函数重写为尾部递归函数可以加快速度。毫无疑问,对于生成斐波那契数或计算阶乘等琐碎情况,它会更快。在这种情况下,有一种典型的重写方法,即使用“辅助函数”和用于中间结果的附加参数。 尾部递归很好地描述了尾部递归函数和非尾部递归函数之间的差异,以及如何将递归函数转换为尾部递归函数。对于这种重写来说什么是重要的-函数调用的数量是相同的(重写之前/之后),不同之处在

  • 假设我编写这样的代码: 我如何让Kotlin优化这些相互递归的函数,以便在不抛出StackOverflower错误的情况下运行main?tailrec关键字适用于单函数递归,但没有更复杂的功能。我还看到一个警告,在使用关键字tailrec的地方没有找到尾部调用。也许这对编译器来说太难了?

  • 我正在从事一个基于C中自定义数据结构list\t的项目。这是可以帮助我操作这个list\t的预定义函数,我被要求编写的函数叫做insert\u list(list\u t,list\u t,int),它是尾部递归的。 我要编写的insert_list()函数接受两个输入,类型为list_t和一个保证不大于第一个list_t大小的额外整数n,并返回另一个list_t,其中包含第一个list_t中的前

  • 我一直在关注这一点,我试图获得一些将普通递归函数转换为尾部递归函数的实践。我设法理解斐波那契和阶乘的版本,但这一个难住了我。我理解算法在做什么,以及在转换中让我困惑的else语句。 在else中,它试图找到一个更接近你想要的数字,然后放弃,并继续使用它找到的数字,该数字低于你建议的数字。 我不知道如何编写使这个尾部递归的辅助函数。对于斐波那契和阶乘,我最终使用了累加器。有没有类似的东西可以在这里使

  • 我试图使用尾部递归局部辅助函数作为赋值的一部分来重新编写代码。 all_except_选项是一个返回类型为fn:string*string list的函数- 下面的函数是不使用尾部递归局部辅助函数的函数 这个函数使用尾部递归,但是我在递归调用助手函数时出错。错误是:错误:非构造函数应用于模式:all\u except\u选项中的参数

  • 我正在尝试在XSLT 2.0中编写一个尾递归函数,它遍历日期的多值变量并返回最早的一个。出于某种原因,我的函数未被SaxonHE9.4识别为尾递归,当输入文件有超过150-200个条目左右时,我会收到以下错误: tail\u rec\u测试第73行出错。xsl:嵌套函数调用太多。可能是由于无限递归。内置模板规则 以下是我的xml输入: 这就是我的xsl-file的样子: 如何将其转换为正确的尾部递