C 递归-数学公式,编写程序

C 递归-数学公式,编写程序,c,recursion,recurrence,C,Recursion,Recurrence,我需要用C语言实现这个数学公式: 我写了一段代码: #include <stdio.h> int c(int n, int k) { if(k == 0) return n; if(c(n,k-1) % 2 == 0) return c(n,k-1)/2; if(c(n,k-1) % 2 != 0) return c(n,k-1) * 3 + 1; } int main() { printf("%

我需要用C语言实现这个数学公式:

我写了一段代码:

#include <stdio.h>

int c(int n, int k)
{
    if(k == 0)
        return n;
    if(c(n,k-1) % 2 == 0)
        return c(n,k-1)/2;
    if(c(n,k-1) % 2 != 0)
        return c(n,k-1) * 3 + 1;
}

int main()
{

    printf("%d", c(3,8));

    return 0;
}
#包括
int c(int n,int k)
{
如果(k==0)
返回n;
如果(c(n,k-1)%2==0)
返回c(n,k-1)/2;
如果(c(n,k-1)%2!=0)
返回c(n,k-1)*3+1;
}
int main()
{
printf(“%d”,c(3,8));
返回0;
}

但我想知道这一切是否都是为了它?它能正常工作吗?我必须承认我在纸上计算它时遇到了一些麻烦…

根据我的计算,n=3,k=8的正确答案应该是4,所以你的例子应该给你这个答案。程序本身看起来是正确的

更新:

以下是我在纸上的做法:

我们从c(0)开始,因为在这种情况下,值在任何情况下都是已知的:

c(0)=n=3
向上,在每一步选择基于c(k-1)均匀度的计算方法:


如果您的表达式正确,那么它应该可以工作。您不应该多次进行相同的递归调用。它将使运行时成指数而不是线性。@interjay:有趣的一点。所以它应该更像这样:?@forwarding\u coder:但是第二个版本(来自pastie)也是有效的,对吗?@forwarding\u coder这是错误的。多个相同的递归调用将导致重复调用。也许编译器足够聪明,可以注意到函数是纯函数,没有副作用,因此不需要多次调用,但大多数不会(GCC在这里不会优化为一次调用)。这不是关于迭代和递归,而是关于一个递归调用和多个调用。你能这么客气地写下你是如何一步一步手工计算的吗?是的,对于3和8,我的程序给了我4,所以它似乎是正确的。@BrianBrown:很乐意帮忙!
c(1)=c(0)*3+1=10
c(2)=c(1)/2=5
c(3)=c(2)*3+1=16
c(4)=c(3)/2=8
c(5)=c(4)/2=4
c(6)=c(5)/2=2
c(7)=c(6)/2=1
c(8)=c(7)*3+1=4