函数fun(n)定义如下:
fun(n) = 1 (if n <=1)
fun(n) = fun(n/2) (if n is even)
fun(n) = 2*fun((n-1)/3) (if n> and n is odd)
我试图写一个递归函数来计算并返回结果。我刚开始学习递归,我在做这个功能时有点迷失。有人可以纠正我并向我解释一下吗?谢谢!
这就是我的所作所为:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int fun(int n);
int main()
{
int num;
printf("\nEnter a number: ");
scanf("%d", num);
printf("Result = %d\n", fun(num));
return 0;
}
int fun(int n)
{
if (n <= 1)
{
return 1;
}
else if (n % 2 == 0)
{
return fun(n / 2);
}
else if ((n > 1) && (n % 2 == 0))
{
return 2 * fun((n - 1) / 3);
}
}
预期产出:
Enter a number: 13
Result = 2
Enter a number: 34
Result = 4
输出I&#39;而是:
Enter a number: 13
Result = 1
Enter a number: 34
Result = 1
答案 0 :(得分:6)
scanf
将指针作为int
的{{1}}作为%d
的参数,即
scanf("%d", &num);
此外,您的函数fun
无法处理所有情况,可能会脱离底层:
if (n <= 1)
{
return 1;
}
else if (n % 2 == 0)
{
return fun(n / 2);
}
else if ((n > 1) && (n % 2 == 0))
{
return 2 * fun((n - 1) / 3);
}
永远不会满足最后一个else if
条件,因为在这种情况下,n % 2 == 0
的先前检查已经返回。此外,n > 1
毫无意义,因为在所有其他情况下,第一个n <= 1
会返回。
你可以简单地做到:
else
{
return 2 * fun((n - 1) / 3);
}
答案 1 :(得分:2)
罪魁祸首是最后else if
条件。将其更改为:
else if ((n % 2) != 0)
答案 2 :(得分:1)
n为奇数的条件在这里写错了。你写了与n是偶数时相同的东西。
最好明确地让案件脱节,以便你总是回来并且没有警告,如下:
int fun(int n)
{
if(n <= 1)
return 1;
if(n % 2 == 0)
return fun(n/2);
//No need for a condition, we know the last one must be satisfied
return 2 * fun((n-1)/3);
}
或者,添加另一个&#34;默认&#34;表示存在错误的案例。
答案 3 :(得分:1)
我认为最后if
应该是:
else if ((n > 1) && (n % 2 != 0))
请注意!=
而不是==
。
答案 4 :(得分:0)
第三个条件
else if ((n > 1) && (n % 2 == 0))
错误,但不是仅修改else
没有else if
- 而是因为已经检查了所有其他条件。