C# 为什么这个方法需要递归?

C# 为什么这个方法需要递归?,c#,algorithm,C#,Algorithm,一时兴起,我决定回去寻求认证,从98-361《软件开发基础》开始。(我做这件事更多的是为了自己。我想填补我知识上的空白。) 在本书的早期课程中,他们在熟练评估部分介绍了这个有趣的场景: 您正在为您的应用程序开发一个实用函数库 应用您需要编写一个接受整数和 计算其中的有效位数。您需要创建一个递归程序 解决这个问题。你会怎么写这样一篇文章 节目 我发现自己茫然地看着这种情景。如果我正确理解了“有效数字”,那么就不需要对整数的有效数字进行递归计数的函数。而且,任何坚持它是递归的架构师都应该检查他的脑袋

一时兴起,我决定回去寻求认证,从98-361《软件开发基础》开始。(我做这件事更多的是为了自己。我想填补我知识上的空白。)

在本书的早期课程中,他们在熟练评估部分介绍了这个有趣的场景:

您正在为您的应用程序开发一个实用函数库 应用您需要编写一个接受整数和 计算其中的有效位数。您需要创建一个递归程序 解决这个问题。你会怎么写这样一篇文章 节目

我发现自己茫然地看着这种情景。如果我正确理解了“有效数字”,那么就不需要对整数的有效数字进行递归计数的函数。而且,任何坚持它是递归的架构师都应该检查他的脑袋

还是我不明白?我完全错过了什么吗?据我所知,有效数字是一个数字的数字,从左边开始,一直到右边,不包括任何前导零

在什么条件下,这需要是递归的?(对我来说,这个练习的全部目的就是学习新东西。有人扔给我一根骨头。)

编辑:我不想要这个问题的答案。我可以自己解决这个问题。在我看来,通过对字符串中的字符进行简单的foreach循环,可以更容易地解决这个“问题”

最终编辑

根据下面这些令人敬畏的海报的明智建议,这是我想出的解决问题的简单方法。(不管我有多担心。)

这种算法不需要递归。但这里的目的不是编写真实世界的代码,而是确保您理解递归

既然你说你不是在追求代码,我在这里会很小心,但是我需要提供一些东西来比较解决方案的复杂性,所以我将使用伪代码。递归解决方案可能类似于:

def sigDigits (n):
    # Handle negative numbers.

    if n < 0:
        return sigDigits (-n)

    # 0..9 is one significant digit.

    if n < 10:
        return 1

    # Otherwise it's one plus the count in n/10 (truncated).

    return 1 + sigDigits (n / 10)
def SIG数字(n):
#处理负数。
如果n<0:
返回数字(-n)
#0..9是一个有效数字。
如果n<10:
返回1
#否则它是1加上n/10中的计数(截断)。
返回1+10位数字(n/10)
你是对的,它和迭代一样可行

def sigDigits (n):
    # Handle negative numbers.

    if n < 0:
        n = -n

    # All numbers have at least one significant digit.

    digits = 1

    # Then we add one and divide by ten (truncated), until we get low enough.

    while n > 9:
        n = n / 10
        digits = digits + 1

    return digits
def SIG数字(n):
#处理负数。
如果n<0:
n=-n
#所有数字至少有一个有效数字。
数字=1
#然后我们加上1除以10(截断),直到足够低。
当n>9时:
n=n/10
位数=位数+1
返回数字
<> P>有一些(通常是一个数学弯曲,包括我自己)认为递归算法在它们合适的地方更优雅(例如,“解决方案搜索空间”非常快地减少以便不吹出堆栈)。 我对这种特殊情况的适用性提出质疑,因为迭代解并不太复杂,但提问者必须提供一些问题,而这个问题相对容易解决

并且,根据您的编辑:

。。。通过对字符串中的字符进行简单的foreach循环,可以更容易地解决此问题


你没有字符串,你有一个整数。我不怀疑你可以把它变成一个字符串,然后计数字符,但这似乎是一种迂回的方法。

它不需要递归。问题很简单,就是要求您编写一个递归实现,大概是为了测试您对递归函数如何工作的理解。

这似乎是一个非常强迫的例子。这个问题可以用更简单的迭代算法来解决

很多教学资源都很难提供何时使用递归的有用示例。从技术上讲,您永远不需要使用它,但对于一大类(主要是算法)问题,它确实可以简化事情


例如,考虑A上的任何操作。由于二叉树的物理结构是递归的,因此对其进行运算的算法自然也是递归的。您也可以编写命令式算法来操作二叉树,但递归算法更易于编写和理解。

它不需要递归。简单地说,问题是要求你写一个递归实现,大概是为了测试你对递归函数如何工作的理解。他们可能只是想评估你是否真的可以写一个递归方法,并把它作为一个示例问题——这个问题根本不需要使用递归“在现实世界中”。我认为你问这个问题的事实意味着你已经掌握了这个练习。@Mike Hofer:“使用简单的foreach循环要容易得多”--但不是每种语言都有for循环,或者至少没有一个是自然的。比如,看看Haskell。@DSM:注意到了,但这本书是专门针对C#开发人员的。(可能应该在问题中注意到这一点。)我大体上同意你的评估。至于我的编辑,人们可能会说我们从一个整数开始,然后采取最直接的方法来解决问题。我非常喜欢“正确解决问题的最简解”,等等。在我看来,在这个特殊的例子中,递归对于手头的问题来说是一个巨大的滥杀滥伤。事实上,我经常使用递归,这让我觉得这是一个显然不需要的场景。
def sigDigits (n):
    # Handle negative numbers.

    if n < 0:
        n = -n

    # All numbers have at least one significant digit.

    digits = 1

    # Then we add one and divide by ten (truncated), until we get low enough.

    while n > 9:
        n = n / 10
        digits = digits + 1

    return digits