关于递归,希望有大佬能给我讲讲

xuerueheng 2019-08-04 05:26:52
来,先上代码

static void digui(int a,int b)
{
if (a + b == 5)
{
Console.WriteLine(a + b);
return;
}
Console.WriteLine("a变量还差"+(5-b-a));
a++;
digui(a, b);
}

有办法让这个递归只提醒一次a变量差多少吗?
求各位大佬支招啊,最好方式简单一点,因为我刚学太深奥我怕听不懂。
...全文
136 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
一个武术猴子 2019-08-05
  • 打赏
  • 举报
回复
递归就是自己调取自己执行程序。 不过要加上条件。不要别变成死循环了就这些、
xuerueheng 2019-08-05
  • 打赏
  • 举报
回复
引用 13 楼 f**kcsdn 的回复:

//是否提醒标记
//默认未否
static bool isNotified = false;

static void digui(int a, int b)
{
if (a + b == 5)
{
Console.WriteLine(a + b);
return;
}
//如果没有提示过
if (isNotified == false)
{
//进行提示
Console.WriteLine("a变量还差" + (5 - b - a));
//将提醒标记改成是,说明已经提醒过了
isNotified = true;
}
a++;
digui(a, b);
}

哎,大佬,我突然想起来,您的

static bool isNotified=false;

其实是声明了一个变量是吗?
xuerueheng 2019-08-05
  • 打赏
  • 举报
回复
引用 13 楼 f**kcsdn 的回复:

//是否提醒标记
//默认未否
static bool isNotified = false;

static void digui(int a, int b)
{
if (a + b == 5)
{
Console.WriteLine(a + b);
return;
}
//如果没有提示过
if (isNotified == false)
{
//进行提示
Console.WriteLine("a变量还差" + (5 - b - a));
//将提醒标记改成是,说明已经提醒过了
isNotified = true;
}
a++;
digui(a, b);
}

奥,懂了,懂了,谢大佬
csdnFUCKINGSUCKS 2019-08-05
  • 打赏
  • 举报
回复

//是否提醒标记
//默认未否
static bool isNotified = false;
 
static void digui(int a, int b)
{
    if (a + b == 5)
    {
        Console.WriteLine(a + b);
        return;
    }
    //如果没有提示过
    if (isNotified == false)
    {
        //进行提示
        Console.WriteLine("a变量还差" + (5 - b - a));
        //将提醒标记改成是,说明已经提醒过了
        isNotified = true;
    }
    a++;
    digui(a, b);
}
Eason0807 2019-08-05
  • 打赏
  • 举报
回复
你不是要“a变量还差”这个字符串只输出一次吗?这个if就是干这个的,一旦满足了条件,最后isNotified = true之后就再也不执行了
xuerueheng 2019-08-05
  • 打赏
  • 举报
回复
引用 7 楼 f**kcsdn 的回复:

static bool isNotified = false;

static void digui(int a, int b)
{
if (a + b == 5)
{
Console.WriteLine(a + b);
return;
}
if (!isNotified)
{
Console.WriteLine("a变量还差" + (5 - b - a));
isNotified = true;
}
a++;
digui(a, b);
}

大佬我没看懂这几行代码,您能给我解释一下吗?

static bool isNotified = false;


if (!isNotified)
{
Console.WriteLine("a变量还差" + (5 - b - a));
isNotified = true;
}

主要是没看懂isNotiffied方法和if中的条件。
wanghui0380 2019-08-05
  • 打赏
  • 举报
回复
后面在来一个信号锁的,当然解释我就不解释了,你自己说的,不能太深奥,所以不解释了。你心里知道有这个就好

  static void Main(string[] args)
        {


            digui(0, 1);
            digui(0, 1);
            Console.ReadKey();

        }

        private static System.Threading.Semaphore semaphore = new Semaphore(1, 1);

        static void digui(int a, int b)
        {

            if (semaphore.WaitOne(TimeSpan.Zero))
            {
                Console.WriteLine("第一次进入做,后续进入被锁不做");
            }



            if (a + b == 5)
            {
                Console.WriteLine(a + b);
                return;
            }

            a++;

            digui(a, b);
            try
            {
                semaphore.Release();
            }
            catch (Exception e)
            {

            }


        }
ManBOyyy 2019-08-05
  • 打赏
  • 举报
回复
引用 7 楼 f**kcsdn 的回复:

static bool isNotified = false;

static void digui(int a, int b)
{
if (a + b == 5)
{
Console.WriteLine(a + b);
return;
}
if (!isNotified)
{
Console.WriteLine("a变量还差" + (5 - b - a));
isNotified = true;
}
a++;
digui(a, b);
}

應該先判斷a+b一定要先判斷大於5吧,不然死循環了吧
wanghui0380 2019-08-05
  • 打赏
  • 举报
回复
你这个和递归没关系,你可以当信号量。当然我这里先写一个lazy<T>,因为他的特性刚刚好就是只玩一次
 private static Lazy<Task> write;

        static void digui(int a, int b)
        {
            if (write == null)
            {
                write= new Lazy<Task>(()=>Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("a变量还差"+(5-b-a));
                }));
            }

             write.Value.Wait();
            if (a + b == 5)
            {
                Console.WriteLine(a + b);
                return;
            }

            a++;
            digui(a, b);
        }
csdnFUCKINGSUCKS 2019-08-05
  • 打赏
  • 举报
回复

static bool isNotified = false;

static void digui(int a, int b)
{
    if (a + b == 5)
    {
        Console.WriteLine(a + b);
        return;
    }
    if (!isNotified)
    {
        Console.WriteLine("a变量还差" + (5 - b - a));
        isNotified = true;
    }
    a++;
    digui(a, b);
}
xuerueheng 2019-08-05
  • 打赏
  • 举报
回复
引用 3 楼 秋的红果实 的回复:
你好解决什么实际问题?
不是要执行过程?

没有,这个练习就是我写的,但我发现运行后它重复输出了“a变量还差多少”这句话,我想解决的就是让它不要重复输出这句话
XBodhi. 2019-08-04
  • 打赏
  • 举报
回复
一句话,自己调用自己无返回值的方法就是递归。
秋的红果实 2019-08-04
  • 打赏
  • 举报
回复
你好解决什么实际问题? 不是要执行过程?
xuerueheng 2019-08-04
  • 打赏
  • 举报
回复
引用 1 楼 秋的红果实 的回复:
digui(1,3)
执行过程大致

digui(1,3)
{
if (1 + 3 == 5)
{
Console.WriteLine(a + b);
return;
}
Console.WriteLine("a变量还差" + (5 - 3 - 1));
a++;a = 2;
//digui(a, b);
digui(2, 3)
{
if (2 + 3 == 5)
{
Console.WriteLine(a + b);
return; //返回
}
//不执行了
Console.WriteLine("a变量还差" + (5 - 3 - 2));
a++; a = 3;


}
}

没解决实际问题啊
秋的红果实 2019-08-04
  • 打赏
  • 举报
回复
digui(1,3) 执行过程大致

digui(1,3)
{
    if (1 + 3 == 5)
    {
        Console.WriteLine(a + b);
        return;
    }
    Console.WriteLine("a变量还差" + (5 - 3 - 1));
    a++;a = 2;
    //digui(a, b);
    digui(2, 3)
    {
        if (2 + 3 == 5)
        {
            Console.WriteLine(a + b);
            return; //返回
        }
        //不执行了
        Console.WriteLine("a变量还差" + (5 - 3 - 2));
        a++; a = 3;
        

    }
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧