C# 递归。

斐波那契数列 指的是这样一个数列 1, 1, 2, 3, 5, 8, 13

规律就是这个数列从第3项开始,每一项都等于前两项之和;

代码如下

static int fib(int n)
{
    if (n < 3)
        return 1;
    else
        return fib(n - 2) + fib(n -1);
}

二: 1 + 2 + 3 + 4 + 5 + ....+ N,累加求和,用递归的方式写

代码如下:

static int Add(int n)
{
     if( n == 1)
        return n;
     else
        return Add(n - 1) + n;
}
//可以用 ?: 三元运算符简化一下
static int Add2(int n)
{
    return n == 1 ? 1 : Add2(n -1) + n;
}

三:找到二维数组中为1的岛屿的个数,岛屿是可以通过上下左右联通的,比如图中这个二维数组里的岛屿就是有4个。

C# 递归。_第1张图片

这个我当时想的是两个for循环数组里的每个元素,是1的就用一个递归去找自己上下左右的元素。但是这样有个问题,如果它找了一圈没有发现有1的话,它还会找到自己,这样就是一个死循环了。然后看了网上的解析,找到是1的把1改为2就行了。

代码如下:

class Island
    {
        static int[,] island = { 
                                { 1, 0, 0, 0, 1, 0, 0, 1 },
                                { 0, 0, 1, 0, 0, 0, 0, 0 },
                                { 0, 1, 1, 1, 0, 0, 0, 0 }, 
                                { 0, 0, 1, 0, 0, 1, 1, 0 }, 
                                { 0, 0, 0, 0, 0, 1, 1, 0 }, 
                                { 0, 0, 1, 0, 0, 0, 0, 0 }, 
                                { 0, 0, 0, 0, 0, 0, 0, 1 }, 
                            };
         
        public static void FindIsland()
        {
            int count = 0;
            for(int i = 0; i < row; i++)        //循环行
                for(int j = 0; j < col; j++)    //循环列
                {
                    if(island[i,j] == 1)        //有岛屿
                    {
                        count ++;
                        rec(i, j);
                    }
                }
            System.Console.WriteLine("Island count: " + count);
        }
        //行
        static int row{
            get{
                return island.GetLength(0);
            }
        }
        //列
         static int col{
            get{
                return island.GetLength(1);
            }
        }    
        static void rec(int i, int j)
        {
            island[i,j] = 2;
             
            if(i - 1 >= 0 && island[i - 1, j] == 1)     //top
                rec(i - 1,j);
             
            if(i + 1 < row && island[i + 1, j] == 1)    //bot
                rec(i + 1,j); 
             
            if(j - 1 >= 0 && island[i, j - 1] == 1)     //left
                rec(i,j - 1);
             
            if(j + 1 < col && island[i, j + 1] == 1)    //right
                rec(i,j + 1);
        }
    }

四:闲来无事写了个递归,算吉他的每根吉他弦上每个全音对应的品丝

1.七个自然音唱名:do, re, mi, fa, sol, la, si(这个大家应该都懂),调名嘛:CDEFGAB,唱名调名是相互对应的。

2.吉他嘛,6根弦,从细到粗分为1,2,3,4,5,6弦。标准调弦的吉他的1-6弦的音是 mi si sol re la mi。也就是EBGDAE。

3.音程:CDEFGAB,

C -> D : 2,    D -> E : 2,   E -> F : 1,    F -> G : 2,    G -> A : 2,     A -> B: 2,    B -> C : 1

也就是除了 mi -> fa, si -> do 是隔了一个音程,其他都是隔了两个音程。

4. 问题来了,怎么写了?

   ①:写个叫吉他的类,class Guitar{};

   ②:吉他类里写个琴弦的类,class Strings{};

   ③:琴弦类里有自己的琴弦号(StrID),琴弦音(StrChord),每根琴弦的每个品对应的音(???)

   代码如下:

using System.Collections.Generic;
namespace Train
{
    //自然的唱名和调名
    public enum NSC
    {
        C = 1, //do
        D = 2, //re
        E = 3, //mi
        F = 4, //fa
        G = 5, //sol
        A = 6, //la
        B = 7, //si
    }

  
    public class Guitar
    {
        //琴弦类
        public class Strings
        {
            //琴弦号 
            public int StrID;
            
            //琴弦音
            public NSC StrChord;
            
            //每根琴弦的每个品对应的音
            public Dictionary PicChords;
        }

        //琴弦的集合,其实就是6个琴弦
        public List GuitarStrs = new List();

        //标准调弦的吉他 1 - 6弦是 EBGDAE
        List StrChords = new List { NSC.E,NSC.B,NSC.G,NSC.D,NSC.A,NSC.E};

        //每根琴弦上所有品的音,这个标准调弦的音
        public Dictionary Pins = new Dictionary();

        //初始化,也就是把对应的数据都放到吉他的每个琴弦的每个品上
        public void Init()
        {
            //循环6次用来装填6根琴弦的音
            for (int i = 0; i < 6; i++)
            {
                next(0,StrChords[i]);
                Strings strs = new Strings
                {
                    StrID = i + 1, //琴弦
                    StrChord = StrChords[i], //琴弦音
                    PicChords = new Dictionary(Pins),
                };
                GuitarStrs.Add(strs);
                Pins.Clear();
            }
        }
        
        //递归装填每个全音品的音,pin:品丝,chord:自然音
        void next(int pin, NSC chord)
        {
            //超过20品就停止。要用 >= ,不能用 ==
            if (pin >= 20)
                return;
            else
            {
                //半音就是加一个品,全音就加两个品. (就两个半音, E->F, B->C )
                pin = chord == NSC.B || chord == NSC.E ? pin + 1 : pin + 2;

                //走到B的时候再从头(C)开始走
                chord = chord == NSC.B ? NSC.C : chord + 1;

                //递归
                next(pin, chord);
            }
            Pins.Add(pin, chord); //装填
        }
        
    }
}

我用了名为NSC的枚举类型存放7个自然音,每根琴弦的每个品对应的音用了Dictionary类型来存放。

后面用了next()方法递归给每个品赋值。

调用:

C# 递归。_第2张图片

结果:

C# 递归。_第3张图片

我弹了一遍,是对的!!!

 

 

你可能感兴趣的:(C#)