【问题标题】:Computing some recursive functions in C在 C 中计算一些递归函数
【发布时间】:2014-12-15 17:49:13
【问题描述】:

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

  1. 给定:如果 n 是偶数,则 f(n) = n/2,如果 n 是奇数,则 f(3n+1)。 如何编写递归函数来计算 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) 使用 google 和 "Collat​​z in C" 2) 你确定你复制的程序正确吗,在尝试解决“递归”问题之前有很多语法问题。
  • 听起来像是学校作业。您的代码中有一些明显的问题,这是第 2 部分希望您解决的问题。
  • 你对silly()的递归调用的返回值做了什么?什么都没有,silly() 没有返回值。
  • 之前发过完整的作业答案,结果发现OP不客气的删了题——不让同学看到?
  • 问题陈述的无限递归:从 n = 1 开始,然后调用 f(3n+1) = f(4)。调用 f(n/2) = f(2),然后调用 f(n/2) = f(1) 重复循环。

标签: c recursion


【解决方案1】:

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);
}

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 2021-07-24
    • 1970-01-01
    • 2013-11-26
    • 2015-07-28
    • 2021-05-03
    • 1970-01-01
    • 2023-02-04
    • 2022-11-25
    相关资源
    最近更新 更多