c - 通过递归取余

标签 c

我正在学习递归,在解决正整数a除以正整数b的余数计算问题时遇到了概念上的疑问。

我的代码是:

#include<stdio.h>
#include<stdlib.h>
int x;
int rem(int a,int b)
{
    x=a;
    if(x>=b)
    {
        x=x-b;
        rem(x,b);
    }
    printf("%d\n",x);
    return x;
}
int main()
{
    int a,b;
    printf("Enter a & b\n");
    scanf("%d %d",&a,&b);
    int y =rem(a,b);
    printf("rem is :%d",y);
    return 0;
}

它工作正常。我了解到,每次调用都会创建一组新的形式参数和局部变量。

所以我通过在每次递归调用返回时打印 x 来进行实验! 但是是打印1 1 1 1。为什么没有打印特定调用对应的x的值。 ?

为什么只打印最后修改的值?..那是因为我声明'x'是全局的吗?

最佳答案

在这种情况下,您可能只需要将打印上移

int rem(int a,int b)
{
    x=a;
    printf("%d\n",x);
    if(x>=b)
    {
        x=x-b;
        rem(x,b);
    }
    return x;
}

但我认为您应该避免在递归算法中使用全局变量。这可能会使算法很难推理。递归函数最好是“纯函数”。

关于c - 通过递归取余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977962/

相关文章:

c - 使用指针为结构体分配内存

cURL 在 Release模式下崩溃,而不是在调试中

c - STM32外部中断一直触发

c - 使用 fork() 的二叉进程树

c - 使用预接收 Git 钩子(Hook)强制编码风格

c - 使用 libsndfile 为 MATLAB 编写多 channel 音频

java - 处理循环特殊情况

c++ - 包括来自不同目录的头文件的问题[不是路径问题]

c++ - USB 大容量存储 linux

c - Linux 中 inet_addr_lst 内核符号的用途是什么?