我在编写递归函数方面遇到了麻烦。
三角形数字如下:
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是 添加到上一个三角形数字。例如,计算第四个三角形数 通过在第三个三角形数字(即6)上加4,即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;
}
但是我不确定这是否是正确答案,是否有人可以帮助指导我如何解决这个问题?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
对于递归调用,您需要知道从n-1到n的公式。在您的情况下f(n) = n + f(n-1)
。
答案 2 :(得分:0)
int triangular(int n) {
if (n == 1)
return 1;
return n + triangular(n-1)
}
让n
- 三角形数字由函数f(n)
表示。所以,现在我们需要找到一种方法将函数的这种状态与先前的状态联系起来,其中状态由函数f
的参数表示。我们注意到,如果我们知道(n-1)
- 三角形数字,我们可以找到n
- th,其公式为f(n) = n + f(n-1)
。有了这个,我们递归地说明了函数f,即,我们使用它的先前状态(在这种情况下它只有一个先前的状态f(n-1)
)来计算函数的状态。实施很简单。如果您仍然不了解实现,请尝试使用图表绘制递归,然后您就会明白为什么它是正确的。
答案 3 :(得分:0)
你真的不需要循环。它不是一个迭代过程,而是一个递归实现。答案在于你的文字:
例如,通过将4加到第三个三角数
来计算第四个三角形数
推广,通过将 n (4)添加到 n-1 的三角形来计算 n (第四)三角形(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);
}