一列数的规则以下: 一、一、二、三、五、八、1三、2一、34...... 求第30位数是多少, 用递归算法实现。

一列数的规则以下: 一、一、二、三、五、八、1三、2一、34...... 求第30位数是多少, 用递归算法实现
答:html

public class MainClass 
  { 
        public static void Main() 
        { 
                Console.WriteLine(Foo(30)); 
         } 
         public static int Foo(int i) 
         { 
              if (i <= 0) 
              return 0; 
              else if(i > 0 && i <= 2) 
              return 1; 
              else return Foo(i -1) + Foo(i - 2); 
          } 
    }

或者:算法

public int GetNumberAtPos(int pos)
        {
            if(pos==0||pos==1)
            {
                return 1;
            }
            int res = GetNumberAtPos(pos - 1) + GetNumberAtPos(pos - 2);
            return res;
        }

或者:函数

static int Fn1(int n)
        {
            if (n <= 0)
            {
                throw new ArgumentOutOfRangeException();
            }

            int a = 1;
            int b = 1;
            int c = 1;

            for (int i = 3; i <= n; i++)
            {
                c = checked(a + b); 
                a = b;
                b = c;
            }
            return c;
        }

不用递归:性能

static void Main(string[] args)
        {
            int[] num=new int[30];
            num[0]=1;
            num[1]=1;
            int first=num[0];
            int second=num[1];
            for (int i = 2; i < num.Length; i++)
            {
                num[i] = first + second;
                first = second;
                second = num[i];
            }
            Console.WriteLine(num[29]);
            Console.ReadLine();
        }

     
什么是递归函数/方法?.net

任何一个方法既能够调用其余方法又能够调用本身,而当这个方法调用本身时,咱们就叫它递归函数或者递归方法!code

一般递归有两个特色: htm

1.递归方法一直会调用本身直到某些条件知足,也就是说必定要有出口;blog

2.递归方法会有一些参数,而它会把这些新的参数值传递给本身;(本身调本身);递归

递归问题要知足三个条件:ip

一个问题能够分解成多个子问题的解;子问题就是规模更小的问题(逻辑不变
这些被分解的子问题,除了规模不同以外,解决思路同样
存在条件来终止递归;这个好理解,由于本身调用本身总不能无线循环下去,因此必须有终止条件

递归解决方案对于复杂的开发来讲很方便,并且十分强大,但因为频繁使用调用栈(call stack)可能会引发性能问题(有些时候性能极差)。

递归一般用于:  ①.阶乘  ②.斐波拉切数列;

1.阶乘

阶乘(!)是小于某个数的全部正整数的乘积;注意:0既不是正整数,又不是负整数;0是整数;你知道的,n的阶乘实际上就是n-1的阶乘乘以n,且n>0;它能够表示成Factorial(n)=Factorial(n-1)*n;这是方法的返回值,但咱们须要一个条件,也就是出口(注意:递归必定要有出口)若是n=0则返回1.

public long Fac(int n) 
{ 
if (n == 0)
return 1; 
return n * Fac(n - 1); 
}

不用递归:

public long Fac(int n) 
{ 
if (n == 0) 
return 1; 
long value = 1; 
for (int i = n; i > 0; i--) 
{ 
value *= i; 
} 
return value; 
}

C#递归算法计算阶乘的方法

2.(Fibonacci)斐波拉切数列:

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda
Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:一、一、二、三、五、八、1三、2一、3四、……在数学上,斐波纳契数列以以下被以递推的方法定义:F(1)=1,F(2)=1,
F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........

这个数列从第3项开始,每一项都等于前两项之和。

斐波那契数列算法的三种C#实现及时间复杂度分析

相关文章
相关标签/搜索