母牛问题(递归实现、非递归)实现两种以及 斐波那契数列的实现
【题目】
假设农场中成熟的母牛每年只会生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;
}

浙公网安备 33010602011771号