C中的递归函数如何工作

时间:2014-03-19 15:20:02

标签: c function recursion

函数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

5 个答案:

答案 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 - 而是因为已经检查了所有其他条件。