你了解国内戒毒的现状吗?

小说:你了解国内戒毒的现状吗?作者:平辛陵扁更新时间:2019-03-21字数:60392

这就是两人观念最大的不同,九天玄女是聚集理性和感情于一体之人,看人看事,做人做事是集合理性和感情于一身,所以她就算知道刘皓等人的未来第一时间也不是选择下杀手而是想办法拉拢,缓和。

男女交往最忌讳的是什么?

两位兄弟太守正在商量如何发放官仓粮食问题,忽然听说有赵、恒两州的民众发生争执,便立刻前来察看。
马车驶上山梁,前面无法通行,林风只得停下,从后面拿下剩余的草料,拍拍战马,一路行来,彼此间建立一种极为特殊的感情,接下来的路只能靠自己,“保重!”战马打了一个响鼻,似乎真的听懂。

“怎么样?很大吧。刚才你怎么不把它抓住!”凤凰异常激动地摇着雪飞鸿地手臂。

尾递归wiki解释如下:

  • 尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的。如果有尾部归递,就只需要叠套一个堆栈,因为电脑只需要将函数的参数改变再重新调用一次。利用尾部递归最主要的目的是要优化,例如在Scheme语言中,明确规定必须针对尾部递归作优化。可见尾部递归的作用,是非常依赖于具体实现的。

  • 我们还是从简单的斐波那契开始了解尾递归吧。

  • 用普通的递归计算Fibonacci数列:

#include "stdio.h"
#include "math.h"

int factorial(int n);

int main(void)
{
    int i, n, rs;

    printf("请输入斐波那契数n:");
    scanf("%d",&n);

    rs = factorial(n);
    printf("%d 
", rs);

    return 0;
}

// 递归
int factorial(int n)
{
    if(n <= 2)
    {
        return 1;
    }
    else
    {
        return factorial(n-1) + factorial(n-2);
    }
}

程序员运行结果如下:

请输入斐波那契数n:20
6765

Process returned 0 (0x0) execution time : 3.502 s
Press any key to continue.
在i5的CPU下也要花费 3.502 秒的时间。

下面我们看看如何用尾递归实现斐波那契数。

/#include "stdio.h"
/#include "math.h"

int factorial(int n);

int main(void)
{
    int i, n, rs;

    printf("请输入斐波那契数n:");
    scanf("%d",&n);

    rs = factorial_tail(n, 1, 1);
    printf("%d ", rs);

    return 0;
}

int factorial_tail(int n,int acc1,int acc2)
{
    if (n < 2)
    {
        return acc1;
    }
    else
    {
        return factorial_tail(n-1,acc2,acc1+acc2);
    }
}
  • 程序员运行结果如下:

请输入斐波那契数n:20
6765
Process returned 0 (0x0) execution time : 1.460 s
Press any key to continue.
快了一倍有多。当然这是不完全统计,有兴趣的话可以自行计算大规模的值,这里只是介绍尾递归而已。

我们可以打印一下程序的执行过程,函数加入下面的打印语句:

int factorial_tail(int n,int acc1,int acc2)
{
    if (n < 2)
    {
        return acc1;
    }
    else
    {
        printf("factorial_tail(%d, %d, %d) 
",n-1,acc2,acc1+acc2);
        return factorial_tail(n-1,acc2,acc1+acc2);
    }
}

程序运行结果:

请输入斐波那契数n:10
factorial_tail(9, 1, 2)
factorial_tail(8, 2, 3)
factorial_tail(7, 3, 5)
factorial_tail(6, 5, 8)
factorial_tail(5, 8, 13)
factorial_tail(4, 13, 21)
factorial_tail(3, 21, 34)
factorial_tail(2, 34, 55)
factorial_tail(1, 55, 89)
55
Process returned 0 (0x0)   execution time : 1.393 s
Press any key to continue.
从上面的调试就可以很清晰地看出尾递归的计算过程了。acc1就是第n个数,而acc2就是第n与第n+1个数的和,这就是我们前面讲到的“迭代”的精髓,计算结果参与到下一次的计算,从而减少很多重复计算量。

fibonacci(n-1,acc2,acc1+acc2)真是神来之笔,原本朴素的递归产生的栈的层次像二叉树一样,以指数级增长,但是现在栈的层次却像是数组,变成线性增长了,实在是奇妙,总结起来也很简单,原本栈是先扩展开,然后边收拢边计算结果,现在却变成在调用自身的同时通过参数来计算。

编辑:卓海

发布:2019-03-21 07:45:05

当前文章:http://ayzwzx.cn/news_45208.html

佛家经典禅语 2016·315·新消费我做主 杨绛:什么是好的婚姻 8种一类疫苗的常见不良反应 也许我的春天终于来了。。。 如何应对宝宝的第一个叛逆期! 花博士教你:男女之间的风水很重要!这不是迷信! 孩子如何面对

79200 76253 62176 35742 34840 72602 39328 50626 52626 74709 87323 31635 28583 89571 19793 98082 29981 90380 78431 88201

我要说两句: (0人参与)

发布