繁体   English   中英

返回最小除数的递归函数

[英]Recursive function that returns the smallest divisor

我写了一个函数,递归计算整数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?

没有必要使用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是optinal,因为它的默认值为2 ,您可以像SmallestDivisor(n)一样调用该方法。 如果你想要传递给方法的另一个d值,只需调用SmallestDivisor(n,d)

更换

public static int SmallestDivisor(int n, int d)

public static int SmallestDivisor(int n, int d = 2)

d提供默认值并使此参数可选。 现在你可以调用SmallestDivisor(n)SmallestDivisor(n,3)

命名和可选参数

递归方法会将StackOverflow 15331相对较大的素数(例如15331 )。 非递归解决方案没有这样的问题

public static int MinimalDivisor(int n)
{
    if ( n % 2 == 0)
        return 2;

    for(int d = 3; d < n/2; d=d+2)
        if (n % d == 0)
           return d;

    return n;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM