仅在一次递归函数中提示用户一次ONCE

时间:2018-01-24 00:29:13

标签: c# recursion

所以我在这里简化了一个函数,询问用户是否要继续(使用递归)。如果他们说是,则该功能继续并且自称没问题。但后来它又问了......又一次......它每次都要求它。我只想问一次。是否有任何方法可以在函数内部提出要求,还是绝对有必要把它放在外面?

void RFunction()
{
    bool proceed = true;
    if (proceed && other tests)
    {
        // We have to ask here because we only ask if (other tests)
        proceed = AskUser();
        RFunction();
    }
}

3 个答案:

答案 0 :(得分:0)

在递归堆栈中传递状态变量的常用技术是通过可选参数 在您的示例中,它将是:

void RFunction(bool proceed = false)
{
    if (proceed && other tests)
    {
        // We have to ask here because we only ask if (other tests)
        proceed = AskUser();
        RFunction(proceed);
    }
}

现在用

调用它
RFunction();

它将从proceed设置为false开始,稍后将使用返回的AskUser()覆盖该值。

另请注意,代码当前的结构方式,将其初始化为false并没有多大意义,因为它永远不会到达递归调用。这可能就是你要找的东西:

void RFunction(bool? proceed = null)
{
    if ( !proceed.HasValue ) {
        proceed = AskUser();
    }

    if (proceed.Value && other tests)
    {
        RFunction(proceed);
    }
}

我选择了可​​空的bool,因为另一个答案包括一个带状态计数器的解决方案。现在null表示“我不知道,询问用户”,而真/假意味着/不进行。

答案 1 :(得分:0)

我认为你有3个状态的调用(在没有编译器的情况下编写这个):

void RFunction(int aProceed = 0)
{


    if (aProceed >= 0 && other tests)
    {
      if (aProceed == 0)
         if (AskUser())          
           aProceed++;
        else
           aProceed--;
        // We have to ask here because we only ask if (other tests)           
        RFunction(aProceed);
    }
}

有变化,但这应该做到。

答案 2 :(得分:0)

只是为了与另一个示例相关联,您可以向方法添加一个参数,以指示您是否应该首先提示用户。如果设置为true,则询问用户是否应该继续。否则,您似乎每次都要继续

大概otherTests会在某个时候退出递归。由于您只想在otherTests通过时提示用户,因此只需将该检查放在if条件中。这样,如果测试失败,条件将立即评估为false,并且不会检查其余条件。

请注意,我已在(!askUser || AskUser())条件下合并if。这意味着如果trueaskUser,则为false;否则,如果askUsertrue,则true如果AskUser()返回true则为askUser

所以条件的顺序是:

  1. 如果其他测试失败,则不执行任何操作并退出该功能
  2. 否则(如果测试通过),如果falseif,则执行askUser块中的递归调用
  3. 否则(如果AskUser为真)则调用true方法,如果返回if,则执行AskUser块中的递归调用
  4. 否则(如果false返回void RFunction(bool askUser = true) { if (otherTests && (!askUser || AskUser())) { RFunction(false); } } ),则不执行任何操作并退出函数
  5. 这比其他一些三态解决方案简单,虽然语法可能需要一些时间来习惯?

    brew install postgresql