递归

本文探讨了递归在计算中的三个实例:斐波那契数列的计算、累加求和以及寻找二维数组中1构成的岛屿个数。通过递归实现,详细展示了递归在解决数学问题和遍历数据结构时的有效性。在解决岛屿问题时,指出避免死循环的方法是修改已遍历过的元素值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

斐波那契数列 指的是这样一个数列 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个。

这个我当时想的是两个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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值