大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39

斐波那契数列的概念(下面的知识点来自百度百科)

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,

指的是这样一个数列: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*)

在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

话不多说下面开始给大家上菜:

方法1,毋容置疑,这道题用递归是多么的完美呀。

java中的递归的代码1:

public class Solution {
public int Fibonacci(int n) {
if(n==0)return 0;
if(n==1)return 1;
if(n<0)return n;
return Fibonacci(n-1) + Fibonacci(n-2);
}
}

但是这样同时带来的时间和空间的花费是非常的大的。

java中的递归的代码2:

public class Solution {

    public int Fibonacci(int n) {

        return Fibonacci(n,0,1);

    }    

    private static int Fibonacci(int n,int acc1,int acc2){

        if(n==0) return 0;

        if(n==1) return acc2;

        else     return Fibonacci(n - 1, acc2, acc1 + acc2);   

    }

}

在这个里面用到的递归,是将自己的程序进行分离出去到了另外的一个子函数中去。这样的做法也是非常的nice的。

这里的递归少了一层,所以。还算是比较的不错吧,时间大大相对于上一个减少了很多,但是空间上面还是花费了非常的多的时间。所以也是不是特别的可取。

下面的解答是要用循环进行解答。循环进行解答,在这个里面大大的缩短了时间和空间。

public class Solution {
public int Fibonacci(int n) {
int pre1=0;
int pre2=1;
int sum =0;
if(n==0)return 0;
if(n==1)return 1;
if(n<0)return n;
if(n>1)
{
for(int i=1;i<n;i++){
sum=pre1+pre2;
pre1=pre2;
pre2=sum;
}
}
return pre2;
}
}

喜欢的小伙伴,欢迎留言哦。没有最全,只有更全。如果你有更加好的方法的话,欢迎在我的博客下面进行留言。这样我们互相成就。但是谢绝抄袭。如果转载附上我的地址。

原文地址:https://www.cnblogs.com/littleswan/p/11312286.html

时间: 2024-10-14 16:21:02

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39的相关文章

c语言代码编程题汇总 :从键盘上输入一个整数n,输出斐波纳猰数列——自己打的代码

从键盘上输入一个整数n,输出斐波纳猰数列 程序代码如下: 1 /* 2 2017年3月5日10:35:17 3 功能:n的阶乘采用的是递归方式实现 4 */ 5 6 #include "stdio.h" 7 long fun(int n) //注意此处的fun()是调用函数,两者之间没有空格 8 { 9 if (n > 1) //此处跳出递归的条件是当n = 1时 10 return (n * fun(n -1)); //当n的值满足条件或n = 2时程序还会执行该条语句 11

c语言代码编程题汇总:输入一个整数n,输出斐波纳猰数列,采用的是递归算法——源代码

输出斐波纳猰数列,采用的是递归算法 程序代码如下: 1 /* 2 2017年3月5日11:16:02 3 功能:输入一个整数n,输出斐波纳猰数列,采用的是递归算法,源代码 4 */ 5 6 #include "stdio.h" 7 int fun(int n); //fun()函数的函数声明 8 int main (void) 9 { 10 int i, n = 0; 11 12 printf ("请输入一个整数n的数值:\n "); //此时输入的n是表示第几个数

“《编程珠玑》(第2版)第一章”:查找一个数列中缺失的一个整数

这个题目类似于第二章的第一问题(A问题),不过在这里,因为我现在正在学习第一章,所以就先列为第一章的内容. 今天天铎来访,刚好问了我一个问题:对于1.2.3...100的数列,缺失了一个整数(例如50),那你用什么方法可以找到缺失的这个数? 我的想法就是上一篇博文提到的位图数据结构.天铎提到的是用高斯以前用过的方法(数列前n项和Sn = (a1+an)*n/2)来解决这个问题.具体是这样子做的: 1)我们假设数列没有缺失任何数据,利用前n项和公式求得前n项和sumOf1toN: 2)对实际数列求

输入一个整数n(0&lt;n&lt;2147483647)打印“*”组成的三角形

描述    输入一个整数n(0<n<2147483647)打印"*"组成的三角形, 如下图    输入    第一行有一个整数n(0<n<2147483647)    输出    "*"组成的三角形 public class Main {     public static void main(String[] arg){         int n = 0;         Scanner scanner = new Scanner(Sys

while循环操作,输入一个整数放入到变量n中, 如果这个整数大于0,那么计算1+2+3+……+n的结果, 否则输出“输入的数据有错误”。

import java.util.Scanner; /** * @author 蓝色以太 while循环操作,输入一个整数放入到变量n中, 如果这个整数大于0,那么计算1+2+3+--+n的结果, * 否则输出"输入的数据有错误". */ public class While2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("

输入一个整数,要求不管输入什么,程序都不会崩溃

用到异常处理机制的输入成绩保证程序健壮性的代码 1.编写一个程序,此程序在运行时要求用户输入一个整数,代表某门课的考试成绩,程序接着给出“不及格”.“及格”.“中”.“良”.“优”的结论. 2.要求程序必须具备足够的健壮性,不管用户输入什么样的内容,都不会崩溃. 用到了异常处理机制 import java.util.Scanner; /*编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,2015.11.12底云飞 *程序接着给出“不及格”.“及格”.“中”.“良”.“优”

【c语言】有一函数:x &lt; 0 ,y = -1;x = 0,y = 0;x &gt; 0,y = 1,编程输入一个x值,要求输出对应的y

// 有一函数:x < 0 ,y = -1;x = 0,y = 0;x > 0,y = 1,编程输入一个x值,要求输出对应的y #include <stdio.h> int main() { int x,y; printf("请输入x:"); scanf("%d",&x); if(x > 0) y = 1; else if(x < 0) y = -1; else y = 0; printf("对应的y值是:%d\

编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃。

import java.util.*; class AException extends Exception { String a; AException() { a="输入有误"; } public String toString() { return a; } } class A { public static void main(String args[]) { while(1>0) { Scanner sc = new Scanner(System.in); System

公约数和公倍数 描述 小明被一个问题给难住了,现在需要你帮帮忙。问题是:给出两个正整数,求出它们的最大公约数和最小公倍数。 输入第一行输入一个整数n(0&lt;n&lt;=10000),表示有n组测试数据; 随后的n行输入两个整数i,j(0&lt;i,j&lt;=32767)。输出输出每组测试数据的最大公约数和最小公倍数

#include <stdio.h>int main() { int n,i,j,a,b,t,k; scanf("%d",&n); for(k=0;k<n;k++) { scanf("%d %d",&i,&j); a=i,b=j; if(b%a==0) printf("%d %d\n",a,i*j/a); else{ for(t=1;t!=0;) { t=a%b; a=b; b=t; } printf(&