Loading

母牛问题(递归实现、非递归)实现两种以及 斐波那契数列的实现

【题目】

假设农场中成熟的母牛每年只会生1头小母牛,并且永远不会死。第一年农场有1只成熟的母牛,从第二年开始,母牛开始生小母牛。每只小母牛3年之后成熟又可以生小母牛。给定整数N,求出N年后牛的数量。

【举例】

N=6,第1年1头成熟母牛记为a;
第2年a生了新的小母牛,记为b,总牛数为2;
第3年a生了新的小母牛,记为c,总数为3;
第4年a生了新牛d,总数4;
第5年b成熟了,ab分别生了一只,总数为6;
第6年c也成熟了,abc分别生了一只,总数为9,故返回9.

 
 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第几年?");
        int n = scanner.nextInt();
        int sum = dg(n);//递归方式
//        int sum = fdg(n);//非递归方式
        System.out.println("第" + n + "年总共有" + sum + "头牛");

    }

    //递归实现
    public static int dg(int n) {

        if (n < 1) {
            return 0;
        }

        if (n == 1 || n == 2 || n == 3 || n == 4) {
            return n;
        }

        return dg(n - 1) + dg(n - 3);

    }

    //非递归实现
    public static int fdg(int n) {

        int a = 1; //初始化第一项
        int b = 2;//初始化第二项
        int res = 3;//初始化第三项
        int t = 0;//res的原来值

        if (n == 1 || n == 2 || n == 3) {
            return n;
        }

        for (int i = 4; i <= n; i++) {
            t = res;
            res = b + a;
            a = b;
            b = t;
        }
        return res;
    }

 

斐波那契数列的递归和非递归实现

斐波那契数列:

指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)。

 

递归的原理:

  • 每一级的函数调用都有自己的变量。
  • 每一级函数调用都会有一次返回。
  • 递归函数中,位于递归调用前的语句和各级调用函数具有相同的执行顺序。
  • 递归函数中,位于递归调用后的语句和各级调用函数具有相反的执行顺序。
  • 虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。

递归的优缺点:

优点

  • 实现简单
  • 可读性好

缺点

  • 递归调用,占用空间大
  • 递归太深,容易发生栈溢出
  • 可能存在重复计算

递归的要素:

  • 找到递归结束条件
  • 找出函数的等价关系式
以下是代码:
int fib(int n)//递归函数
{
    if (n == 2 ||n == 1)//结束条件
    {
        return 1;
    }
    else
    {
        return fib(n-2) + fib(n - 1);//递归关系式
    }
}
int main()
{
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    ret=fib(n);
    printf("%d\n",ret);
    system("pause");
    return 0;
}
非递归实现斐波那契数列

 

int fib(int n)
{
    int n1 = 1;
    int n2 = 1;
    int ret = 0;
    if (n <= 2)//n等于1或2时。
    {
        return 1;
    }
    for (int i = 3; i <= n; i++)//通过循环计算n>3时。
    {
        ret = n1 + n2;
        n1 = n2;
        n2 = ret;
    }
    return ret;
}
int main()
{
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    ret=fib(n);
    printf("%d\n",ret);
    system("pause");
    return 0;
}

 

 

 

 
posted @ 2021-02-04 13:59  Robinzhao  阅读(1327)  评论(0)    收藏  举报