【问题标题】:Writing recursive functions编写递归函数
【发布时间】:2017-10-24 00:28:30
【问题描述】:

我在编写递归函数时遇到问题。

三角数如下:

1 = 1

3 = 1 + 2

6 = 1 + 2 + 3

10 = 1 + 2 + 3 + 4

15 = 1 + 2 + 3 + 4 + 5

21 = 1 + 2 + 3 + 4 + 5 + 6

等等

系列从 1(第一个三角形数字)开始。要计算第 n 个三角数,n 是 加到前一个三角数上。例如计算第四个三角数 通过将 4 添加到第三个三角形数(即 6),即 10 = (1 + 2 + 3) + 4。

到目前为止,这是我想出的:

int triNum(n)
{
    if (n<=1)
        return n;

    int num = 0;

    for (int i = 0; i < n; i++)
    {
        num = n + triNum(n-1)
    }
    return num;
}

但是我不确定这是正确的答案,谁能帮助指导我应该如何解决这个问题?

【问题讨论】:

  • 您是否测试过您的代码?它适用于您的测试用例吗?
  • 我会看看在那个 for 循环中发生了什么。
  • 旁白:可以直接计算第n个三角形数:n*(n+1)/2
  • 发布的代码没有执行所需的功能。建议用一个简单的语句替换 for() 循环:return = n + triNum(n-1)

标签: c algorithm recursion


【解决方案1】:

这会产生所需的输出:

int tri(int n) {
    if (n < 1) return 1;
    return (n+1) + tri(n-1);
}

你可以这样测试:

int main(void){
    for (int i=0; i<10; i++) {
        printf("%d: %d\n",i,tri(i));
    }
    return 0;
}

【讨论】:

  • @sidyll 为什么会这样?
  • 定义应该是 n + tri(n-1) 除非你想让它减一。而你忽略了第 0 个三角形数,即 0。
  • Idk 在他的定义中,第一个三角形数是 1,所以我以此开始序列(从 0 开始)。我的代码产生了正确的结果,但如果你认为这个答案是错误的,你可以提交一个不同的答案。
【解决方案2】:

对于递归调用,你需要知道从 n-1 到 n 的公式。在你的情况下f(n) = n + f(n-1)

【讨论】:

    【解决方案3】:
    int triangular(int n) {
        if (n == 1)
            return 1;
        return n + triangular(n-1)
    }
    

    n-th 三角数由函数f(n) 表示。所以,现在我们需要找到一种方法将函数的这个状态与之前的状态相关联,其中状态由函数f 的参数表示。我们注意到,如果我们知道(n-1)-th 三角形数,我们可以通过公式f(n) = n + f(n-1) 找到n-th。有了这个,我们递归地声明了函数 f,即,我们使用它以前的状态来计算函数的状态(在这种情况下,它只有一个以前的状态,f(n-1))。实施很简单。如果你还是不明白实现,试着用图画出递归,你就会明白为什么它是正确的了。

    【讨论】:

      【解决方案4】:

      你并不真的需要循环。这不是一个迭代过程,而是一个递归实现。答案就在你的文字中:

      例如,第四个三角数是通过第三个三角数加4来计算的

      概括地说,第n(第4)个三角形是通过将n(4)添加到n-1(3 )。

      int triNum(n)
      {
          if (n<=1)
              return n;
      
          int num = 0;
      
          num = n + triNum(n-1)
      
          return num;
      }
      

      可以简化为:

      unsigned int
      triNum(unsigned int n)
      {
          if (n <= 1) return n;
          return n + triNum(n-1);
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-06
        • 1970-01-01
        • 1970-01-01
        • 2017-03-18
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多