在C中计算一些递归函数

时间:2014-12-15 17:49:13

标签: c recursion

我是递归函数概念的初学者。我有两个问题要问:

  1. 给定: f(n)= n / 2如果n是偶数,f(3n + 1)如果n是奇数。 如何编写递归函数来计算f(n)?

  2. 您在以下递归函数中注意到了什么问题?显示2种可能的纠正方法。

    int silly(int n )
    {
        if (n<= 0)
            return 1;
        else if (n%2==0)
            return n;
        else 
            silly(n-3);
    }
    

1 个答案:

答案 0 :(得分:0)

  

f(n) = n/2如果n是偶数,f(3n+1)如果n是奇数。

执行此操作的递归函数类似于此伪代码:

def f(n):
    if f % n == 0:  return f(n/2)     # assume integer division.
    return f(3*n-1)

但是,假设每个整数都是偶数或奇数(偶数和奇数没有意义,但对于整数),那么就没有终止条件。您很快就会耗尽堆栈空间,除非您的编译器足够聪明,可以将该递归函数转换为迭代函数,在这种情况下,您将永远运行。

该类型的常见问题陈述具有终止条件,例如“当它达到零时停止”,这将是以下修改:

def f(n):
    if n == 0:     return 0
    if f % n == 0: return f(n/2)
    return f(3*n-1)

事实上,通常你需要测量操作的数量才能达到零,这将是:

def f(n, count):
    if n == 0:     return count
    if f % n == 0: return f(n/2, count+1)
    return f(3*n-1, count+1)

就递归函数而言,问题在于并非所有路径都返回一个值。您可以通过确保它们来解决这个问题。这可以通过简单地在silly (n-3)前添加return来完成,但是,由于我不想拥有所有那些不必要的if/else块,所以写起来更清晰:

int silly (int n) {
    if (n <= 0)     return 1;
    if (n % 2 == 0) return n;
    return silly (n-3);
}