我编写了一个函数,递归计算整数n> 1的最小除数:
using System;
public class Program
{
public static void Main()
{
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(SmallestDivisor(n));
}
public static int SmallestDivisor(int n)
{
return SmallestDivisor(n, 2);
}
public static int SmallestDivisor(int n, int d)
{
if (n%d == 0)
return d;
else
return SmallestDivisor(n, d+1);
}
}
我的目标是构建一个递归函数,只接受整数n作为参数。是否有任何可能的替代方法来避免调用另一个辅助函数作为参数整数n和d?
答案 0 :(得分:6)
不需要2种方法,只需要2种方法:
static void Main(string[] args)
{
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(SmallestDivisor(n));
}
public static int SmallestDivisor(int n, int d=2)
{
if (n % d == 0)
return d;
return SmallestDivisor(n, ++d);
}
参数d
是可选的,因为它的默认值为2
,您可以调用类似SmallestDivisor(n)
的方法。如果您希望将另一个值d
传递给该方法,请调用SmallestDivisor(n,d)
。
答案 1 :(得分:2)
替换
public static int SmallestDivisor(int n, int d)
与
public static int SmallestDivisor(int n, int d = 2)
为d
提供默认值并使此参数可选。现在,您可以致电SmallestDivisor(n)
或SmallestDivisor(n,3)
答案 2 :(得分:1)
递归方法会将StackOverflow例程抛给相对较大的素数(例如 foreach (var item in bla)
{
DataRow row = table.NewRow();
row.SetField<string>(item); //this didn't work.
//foreach (string key in dict.Keys)
//{
// row.SetField<string>(key, item[key]);
//}
}
)。非递归解决方案没有这样的问题
15331