2017-05-03 48 views
-4

在我的课程中,我有一个谜团,编写一个递归函数,它将显示符号'%'和'#'替代用户输入的数字。 因此,如果我说用户输入了数字5,结果将如下所示:'%#%#%'。C#字符串在尝试使用递归函数时保持为空

我想我已完成大部分工作。我现在唯一的问题是,我必须显示符号的字符串在函数每次迭代时都会变为'空'。

这是我的代码:

public static string ShowGibrish(int num) 
{ 
    string s=""; 
    while (num!=0) 
    { 
     if (num % 2 == 0) 
     { 
      s = s+ "%"; 
      ShowGibrish(num - 1); 
     } 
     else if (num % 2 != 0) 
     { 
      s =s+ "#"; 
      return ShowGibrish(num - 1); 
     } 

    } 
    return s; 
} 

其他学生使用StringBuilder的,以使字符串显示,与使用其他私有函数和与公众的函数调用它。但我认为我的代码也可以工作。

回答

1

试试这个:

public static string ShowGibberish(int num) 
{ 
    if (num == 0) { return ""; } 
    else { 
     if (num % 2 == 0) {return "%" + ShowGibberish(num-1);} 
     else {return "#" + ShowGibberish(num-1);} 
    } 
} 

您的代码混合迭代和递归方法。使用一个或另一个只是为了解决这个干净。

+0

你是对的,但由于这是他们的家庭作业,我不认为你应该提供代码。 –

+0

很短的实现,只是为了整洁ShowGibrish拼写有两种不同的方式,也许是正确的? –

+0

@Alex Rosenfeld谢谢,这不像我的代码,但它的工作原理! – Dolev

0

看起来问题在于你的while循环。发生什么是堆栈上的每个函数实例正在执行一个while循环,而不是循环仅由递归处理。函数的每个实例只应在基本情况!= 0而不是基本情况!= 0时执行。

变量的作用域为它们各自的功能,所以在代码的当前状态中,值while循环评估永远不能达到0.

对不起,我不会为你提供代码,因为它是一个任务。

1

您遇到的第一个问题是您在该方法的开始处声明了一个新字符串,但是您绝不会将该字符串传输到递归函数中,这意味着您会从串联中失去所有进度。

第二个问题是你有一个while循环由于某种原因,据我所知在这里不需要。

  1. 首先给函数添加一个可选参数:string s = ""
  2. 取出while循环,它不需要
  3. 你应该做的是检查是否num是否为0,并返回小号,如果它是第一件事。
  4. 修改S的基于你的奇/偶逻辑
  5. 然后返回递归调用ShowGibrish(num - 1, s)

我删除代码的结果,因为我没赶上功课的一部分。

+0

谢谢你的解释!相信我,我不知道那里发生了什么。一位老师教一条路,另一位老师告诉你'不行,应该是这样'我不知道他们想要什么了。 – Dolev