尾递归,C语言实现

深藏阁楼爱情的钟 2022-11-27 08:50 193阅读 0赞

普通递归在执行时需要保存当前数据,并在内存中重新开辟栈。所以普通递归的空间复杂度比较高,效率比较低。所以,我们一般倾向于把递归方式转化成迭代的方式进行计算。但是如果递归语句是整个函数的最后一个语句,则无需保存当前数据,并重新开辟栈。可以直接在当前的栈中继续读取/写入数据。这种递归方式的效率就比较高。递归语句是整个函数的最后一个语句,这种方式称之为尾递归。我们还是用计算sum = 1 + 2 + 3 + … + n举例:

  1. int add1(int n) //普通递归
  2. {
  3. if (n == 0) //递归出口
  4. return n;
  5. else
  6. return n + add1(n - 1); //递归
  7. }

这是普通递归,最后一个语句不是单一的递归语句,而是与加法一起组成的一个复杂语句。

  1. int add2(int n, int sum) //普通递归
  2. {
  3. if (n > 0)
  4. return add2(n - 1, sum + n); //递归
  5. else
  6. return sum; //递归出口
  7. }

这是普通递归,递归语句不是函数的最后一个语句。

  1. int add3(int n, int sum) //尾递归
  2. {
  3. if (n == 0)
  4. return sum; //递归出口
  5. else
  6. return add3(n - 1, sum + n); //尾递归
  7. }

这是尾递归,递归语句是单一的,且递归是这个函数的最后一个语句。这种方式的效率是比较高的。如果可以,尽可能把普通递归转化成尾递归。

总结

1、递归:把大问题分解成小问题后进行求解;递归会占用大量内存,且有可能超出最大递归次数。尾递归不需要保存数据、重新开辟栈,所以尾递归的效率是比较高的。尽可能把递归转化成迭代或尾递归的方式。
2、关于f(n) = 1 + 2 + 3 + … + n的计算,用累加公式 f(n) = n * (n + 1) / 2的效率最高,时间复杂度为O(1)。但这不是本文的研究重点。

发表评论

表情:
评论列表 (有 0 条评论,193人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言实现

    普通递归在执行时需要保存当前数据,并在内存中重新开辟栈。所以普通递归的空间复杂度比较高,效率比较低。所以,我们一般倾向于把递归方式转化成迭代的方式进行计算。但是如果递归语句是整

    相关

    尾递归 如果要说尾递归的话,那么首先应该先说一下递归函数。递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但是循环的逻辑不如递归清晰易理解

    相关 python

    递归函数可以方便的处理一些事物,但普通的递归是栈的堆积,如果堆积的过多就占用过多的内存资源,形象的一些递归就是就像是塔一样,从下至上层层叠加,直到,到达python的限制抛出异

    相关

    什么是尾递归 什么是尾递归呢?(tail recursion), 顾名思议,就是一种“不一样的”递归,说到它的不一样,就得先说说一般的递归。对于一般的递归,比如下面

    相关

    尾递归就是说一个递归函数,在return语句中调用了这个递归函数本身,如图所示。从理论上来说,尾递归都可以用非递归的方法实现。 ![这里写图片描述][70] [70]

    相关

    1、递归 简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满