c - C中的递归函数是如何工作的

标签 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

我得到的输出是:

Enter a number: 13
Result = 1

Enter a number: 34
Result = 1

最佳答案

scanf接受一个指向 int指针作为 %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);
}

关于c - C中的递归函数是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22510402/

相关文章:

c - C中的递归,需要一些解释

c - select() 是否保证所有数据都可用于从套接字读取或仅部分数据

c++ - C/C++如何知道动态分配的数组有多长

java - 使用IPC组合多种语言

c++ - 在 C++ 中使 C 函数指针与基于 C 风格堆栈的调用机制一起工作

c - C 递归程序输出不准确

c - 堆初始化期间文本大小增量

c - 函数应该接受两个参数,一个数组和数组的大小

php - is_category、is_single、is_page 在 function.php 中不起作用

java - 模运算的递归