我是递归函数概念的初学者。我有两个问题要问:
给定: f(n)= n / 2如果n是偶数,f(3n + 1)如果n是奇数。 如何编写递归函数来计算f(n)?
您在以下递归函数中注意到了什么问题?显示2种可能的纠正方法。
int silly(int n )
{
if (n<= 0)
return 1;
else if (n%2==0)
return n;
else
silly(n-3);
}
答案 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);
}