关于递归的一些思考

关于递归:

递归的实现,使代码更加整洁清晰,但是当数据较大的时候,并不能体现出它的优点。

代码:

/**
 * @fuction
 * @author mly11
 * @date 2017年3月16日
 * @time 下午7:46:39
 */
public class Recursion {
    public static void main(String[] args) {
        int x = 30;
        System.out.println(rec(x));

        System.out.println("----------------------------------");
        double y = Math.pow(1.618033988745, x);
        System.out.println(0.4472135955*y);

        System.out.println("------------------------------------");
//        斐波那契数列通式:  记: m^2=5
//        则通式为:F(n) = ( 1/m) * ( ( (1+m)/2 )^n - ( (1-m)/2 )^n );
        double m = Math.sqrt(5);
        double z = (1/m)*(Math.pow(((1+m)/2), x) - Math.pow(((1-m)/2), x));
        System.out.println(z);

//        当n=30的时候,结果为:
//            832040
//            ----------------------------------
//            832039.9999248054
//            ------------------------------------
//            832040.0000000008
    }
//    使用递归计算
    public static int rec(int x){
        if(x == 1){
            x = 1;
        }else if(x == 2){
            x = 1;
        }else{
            x = rec(x-1) + rec(x-2);
        }
        return x;
    }
}

以上代码中,当x为50的时候,我的电脑就需要处理很长时间(从来都是没出来结果,就手动停掉了,哈哈),而剩下的两种方式计算(使用到了高数里的一些特征根和特征方程的知识),数字很大的时候,也可以在1秒之内得到。所以:使用递归的时候,应充分考虑到自己的程序所需要处理的数的大小,也就是递归的深度。

当然,某些时候,正确的使用递归也是可以得到惊喜的。

时间: 2024-08-09 11:25:37

关于递归的一些思考的相关文章

C++模板递归深度的思考

#include <iostream> using namespace std; template<int N> class A { public: enum{ result = N + A<N - 1>::result}; }; template<> class A<1> { public: enum{result=1}; }; int main() { cout << A<500>::result << e

递归入门 Java

对于强大的递归.要想做到灵活运用,是需要花时间进行练习并总结.往往递归学习的入门也是难度也比较大,常常会处于看得明,却写不出的"尴尬"情况. 递归的定义 将一个大的问题分解成比较小的.有着相同形式的问题. 递归是一种强有力的思想.在计算机科学的学习中,一个重要的必须学习的概念是递归.递归是一种编程策略,它把一个大的问题分解成具有相同形式的简单问题. 使用递归的必需条件 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式 存在一种简单情境,可以使递归在简单情境下退出 一般对递

递归训练-放苹果

问题 C: [基础]放苹果 [递归] 时间限制: 1 Sec  内存限制: 128 MB提交: 345  解决: 193[提交][状态][讨论版] 题目描述 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 输入 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. 输出 输出 对输入的每组数据M和N,用一行输出相应的K

雷观(十三):功能优先,开发与重构并举,性能殿后

    根据自己2年多的实际开发经验,我认为:在项目开发过程中,功能是最优先的,开发与重构同样重要,性能放后面考虑. 我们工作的最基本目标是,保证工作单位的项目能够如期交付,至少要保证自己的进度.一份薪水,一份责任.此外,作为技术工作者,我们也有自己的技术追求,提高写程序的能力,写有含金量的代码,保证自己的能力能够与时俱进. 功能优先,进度就是最直接的要求.对于有可视化界面的项目来说,功能能跑通更是最基本的.Boss看不到界面和功能可以正常运行,是不能清楚地知道你的进度了.客户看不到界面,就等于

写递归函数的正确思维方法

递归是编程中一个相对难以理解但是却又很重要的概念. 对于从命令式语言开始学习编程的程序员天生对此有理解缺陷, 而对于从类似C++这种对函数式编程范式不友好的语言开始学习编程的程序员就更加如此了.(比如我自己) 碰巧(其实不巧)最近在读这本书(这本书国内没有引进, 网上只有巨贵的亚马逊卖的原版, 我读的是网上的中文版), Paul Graham在书中讲述的如何写递归函数的部分, 让我印象深刻. 因为原书是讲Lisp的, 当然这个部分也是用Lisp作为例子描述的, 考虑到国内会看这本书的人太少, 能

聊一聊排序算法

聊一聊排序算法 原创 2016-08-11 Barret李靖 两月前花了些时间,将大学里学过的排序算法都复习了一遍,代码放在 github 上,没有整理.今天翻了翻代码,重新 review 了一遍,也顺便做了点记录. 下面花了不少篇幅,将基础排序.希尔.归并.快排.堆排序等都介绍了一通,懒得思考的同学可以略过代码直接看文字,文章对排序的基本思路都做了介绍. 本文的代码可以在这里找到:https://github.com/barretlee/algorithms 三种基本排序 插入排序和选择排序是

[编程之美]资格赛 B Palindrome

既然这个是资格赛,  时间也比较充裕, 我就讲解一下我做题的过程 Time Limit:2000ms Case Time Limit:1000ms Memory Limit:256MB Description Given a string, calculate the number of subsequences that are palindrome. A palindrome is a sequence of characters that reads the same backward o

(林雷看来13):功能优先,发展和重建同步,业绩后

    依据自己2年多的实际开发经验,我认为:在项目开发过程中,功能是最优先的,开发与重构相同重要.性能放后面考虑. 我们工作的最基本目标是.保证工作单位的项目能够如期交付.至少要保证自己的进度.一份薪水,一份责任.此外.作为技术工作者,我们也有自己的技术追求.提高敲代码的能力.写有含金量的代码,保证自己的能力能够与时俱进. 功能优先,进度就是最直接的要求.对于有可视化界面的项目来说,功能能跑通更是最主要的.Boss看不到界面和功能能够正常执行,是不能清楚地知道你的进度了.客户看不到界面.就等于

《Java程序设计》第七次学习总结

<Java程序设计>第七次学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 其他(感悟.思考等,可选) 正文 教材学习内容总结 学习了第十一章"异常"和第十二章"递归".自己思考后总结如下: 第十一章 异常就是那些有可能出现错误的情况,而不是一定就是错误. 异常分为两类:"必检异常"和"非必检异常",在有可能会抛出"必检异常"的方法名后面得加上 throw