递归的美妙

分数序列

问题的提出:

1/2,3/5,4/7,6/10,8/13,9/15....上述的数列的规律:

1:第i项的分母d与分子c的关系是d = c+i.

2:第i项的分子c与前i-1项的分子分母都不相同。

试着求出第2010项,并求出前 2010项中的最大项。

设计:

设置数组c(i)表示第i项的分子,数组d(i)表示分母,初始值c(1) = 1,d(1) = 2.

已知前i-1项的时候如何确定c(i)?显而易见c(i) > c(i-1),通过上述的数列可以知道第i项的分子总是小于第i-1项的分母。

设置k在区间(c(i-1),d(i-1))取值,k分别与分母的每一项比较如果有相同,就k加一再比较,如果没有相同的就产生第i项作赋值:c(i) = k,d(i) = k+i.

求前n项的最大项,设置最大项是第x项(x赋值为1)每次产生第i项如果有c(i)/d(i) > c(x)/d(x)就 x = i

import java.util.Scanner;

public class Main {

    /**
     * @param args
     */
    private static int c[] = new int [3001];//表示分子
    private static int d[] = new int [3001];//表示分母
    private static int max;//最大项
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个(1-3000)的数字");
        int number = input.nextInt();
        c[1] = 1;
        d[1] = 2;
        c[2] = 3;
        d[2] = 5;
        max = 1;//假设第一项是最大项
        for(int i = 3;i<=number;i++)
        {
            for(int k = c[i-1]+1;k<d[i-1];k++)
            {
                int t=0;
                for(int j=1;j<=i-1;j++)
                {
                    if(k == d[j])
                    {
                        t=1;
                        break;
                    }
                }
                if(t == 0)
                {
                    c[i] = k;
                    d[i] = k+i;
                    break;
                }
            }
            if(c[i] * d[max] >c[max]*d[i])//找最大项
            {
                max = i;
            }

        }

        //输出
        System.out.println("第"+number+"为"+c[number]+"/"+d[number]);
        System.out.println("输出第"+max+"项是最大项");
        for(int i = 1;i<=number;i++)
        {
            if(c[i] * d[max]==c[max]*d[i])
            {
                System.out.println("第"+i+"项是最大项:"+c[i]+"/"+d[i]);
            }
        }

    }

}

测试结果:

请输入一个(1-3000)的数字
2010
第2010为3252/5262
输出第1597项是最大项
第1597项是最大项:2584/4181

时间: 2024-08-25 19:48:59

递归的美妙的相关文章

递归神经网络的不可思议的有效性 [ 译 / 转 ]

递归神经网络(Recurrent Neural Networks,RNNs)就像一种神奇的魔法.我至今仍对于我第一次训练递归网络记忆犹新.那个网络是被用于生成图像说明(Image Captioning)的.仅仅进行了几十分钟的训练,我的第一个模型(这个模型中相当一部分超参数都是我随意选取的)就开始能给图片生成看起来非常不错的描述,而这些描述基本上能称得上是有意义的.有时结果的质量和模型复杂度之间的关联性完全超出你的预期,而我的第一次实验就是一个例子.为什么当时这些训练结果看起来如此惊人?是因为大

PHP_递归实现无限级分类

<?php /** * 递归方法实现无限级别分类 * @param array $list 要生成树形列表的数组[该数组中必须要有主键id 和 父级pid] * @param int $pid=0 父级id * @param int $level=0 缩进次数[用于指定分类名称要缩进的数量] */ function getTree($list,$pid=0,$level=0 ) { // static 表示声明一个静态变量, 静态变量在函数中会一直保存它的值 static $tree = arr

3.sql中的向上递归和向下递归

1.向下递归 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with bmbm(本级关联条件)='610000000000'(本级编码)--包含本级 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with sjbmbm(本级关联条件)='6100000

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1

python3 递归

递归调用: 在调用一个函数的过程中,直接或者简介调用了该函数本身 必须有一个明确的结束条件 l = [1,[2,3,[4,5,[6,7,[8,9,[10,11,[12,13]]]]]]] def func(l): for i in l: if isinstance(i,list): func(i) else: print(i) func(l) 应用场景:不知道应该循环多少次,只知道什么时候应该结束

day05匿名函数,内置函数,二分法,递归,模块

yield作为表达式来使用的方式 #grep -rl 'python /root """ 查找root下文件中含有python的文件 """ import os def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init def search(target): while True: search

浅谈递归调用的个人领悟

从大一开始学c,就不是挺理解递归的,最近突然有所体会: 递归调用中递归调用的函数可以把它想象成为一个树的结点,在函数中调用自身就是一个分支,直到出口条件时就是这棵树的叶子结点.叶子的值便是出口返回的值.最后从叶子结点按照你所调用的方法向上返回值,最终结束递归调用.

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

Java递归流程

递归二字顾名思义就是:递过去,归回来.所以我索性叫它做有借有还吧. 下面的例子由c而来: public class Main {                                public static void main(String[] args) {                                      fun(1);                                }                                publ