生活中实践算法之递归

来源:互联网 发布:网站生成app软件 编辑:程序博客网 时间:2024/05/21 19:35

小G无意间听到“Android”这个新玩样,于是乎打开谷歌,输入关键字“Android"试图了解了解,结果网页中秀出一条”Android is an operating system based on the Linuxkernel.....”,--!英语词汇不过关,蓝色字体部分不懂。没办法,再接着借用google继续查找它们的释义“操作系统”,“linux内核”......,直到把生词都弄懂,才初步了解android的意思。

生活中有很多这样相似的例子。其实,这其中就蕴藏着“递归”的思想:(递归策略)-谷歌搜索,(递归出口)-排除生词。

在编程中,这是一个函数调用自身的过程,反复操作中寻求函数出口,下面以大家熟悉的“查找”为例展开分析:

int int_find_recursion(int *array, int length, int value){    int index = length - 1;    if (index < 0) {        return -1;    }    if ((array[index] == value)) {        return index;    } else {        return (int_find_recursion(array, index, value));    }                                                                                                                                                         }

这段代码是从一个整型序列[0, length]中查找“目标数值”value,若不命中目标,则会调用自身从下一个序列[0, length-1]查找,如此反复直到(index < 0);若仍未命中目标,即查找失败。

再举一个“求和”例子:计算0,1,2......n的总和,即sum = 0 + 1 + 2 + ......+n

int sum_calculate_loop(int arrange){    int sum = 0;    int cnt;    for (cnt = 0; cnt <= arrange; cnt++) {        sum += cnt;    }    return sum;}
换种思路,当n=0时,sum[0]=0;sum[n] = n + sum[n-1],那么就可以利用“递归”的思想来实现:

int sum_calculate_recursion(int arrange){    if (0 == arrange) {        return arrange;    } else {        return (arrange + sum_calculate_recursion(arrange - 1));    }}

一般场合下,递归实现的算法较为简洁,但在实际编程应用中还需考量递归过程中频繁堆栈带来的开销。

附:算法的成长之路便是:测试 + 优化,上面”求和“的解法还不是最优,利用求和公式”sum=(n*n + n)/2可更快求解!

下一篇,“非递归排序”将会登场。


原创粉丝点击