C语言中的递归函数

C语言中的递归函数,c,recursion,C,Recursion,我有一个递归函数,我想计算其中的零的数量,如何使用常数来计算零,并且不允许重置 int countZeros(int num) { int count = 0; if (num > 0) { if (num % 10 == 0) count++; return(countZeros(num / 10)); } if (num <= 0) return count; }

我有一个递归函数,我想计算其中的零的数量,如何使用常数来计算零,并且不允许重置

int countZeros(int num)
{
    int count = 0;

    if (num > 0)
    {
        if (num % 10 == 0)
            count++;

        return(countZeros(num / 10));
    }
    if (num <= 0)
        return count;

}
将int设置为静态:

指针也会起作用:

#include <stdio.h>

int countZeros(int num, int * count)
{

    if (num > 0)
    {
        if (num % 10 == 0)
            (*count)++;

    return(countZeros(num / 10,count));
    }
    if (num <= 0)
        return *count;

}

int main(void) 
{

    int count = 0;
    printf("Count = %d",countZeros(1000,&count) );
    return 0;
}
将int设置为静态:

指针也会起作用:

#include <stdio.h>

int countZeros(int num, int * count)
{

    if (num > 0)
    {
        if (num % 10 == 0)
            (*count)++;

    return(countZeros(num / 10,count));
    }
    if (num <= 0)
        return *count;

}

int main(void) 
{

    int count = 0;
    printf("Count = %d",countZeros(1000,&count) );
    return 0;
}
使用静态变量

static int count = 0;
使用静态变量

static int count = 0;
请尝试以下代码:

int countZeros(int num)
{
    if (num > 0 && num % 10 == 0)
        return(countZeros(num / 10)+1);

    else
        return 0;
}
它将以同样的方式工作,只需注意,如果num是负数,但仍然是零,比如-100,它将返回0

要使用负数,请使用以下命令:

int countZeros(int num)
{
    if (num !=0 && num % 10 == 0)
        return (countZeros(num / 10)+1);

    else
        return 0;
}
请尝试以下代码:

int countZeros(int num)
{
    if (num > 0 && num % 10 == 0)
        return(countZeros(num / 10)+1);

    else
        return 0;
}
它将以同样的方式工作,只需注意,如果num是负数,但仍然是零,比如-100,它将返回0

要使用负数,请使用以下命令:

int countZeros(int num)
{
    if (num !=0 && num % 10 == 0)
        return (countZeros(num / 10)+1);

    else
        return 0;
}

没有更多的变量

int countZeros(int n) {
    return n ? (n % 10 ? 0:1)+countZeros(n/10) : 0;
}
countzero也适用于负数

范例

printf("%d\n", count( 10001));  // prints "3"
printf("%d\n", count(-10001));  // prints "3"

没有更多的变量

int countZeros(int n) {
    return n ? (n % 10 ? 0:1)+countZeros(n/10) : 0;
}
countzero也适用于负数

范例

printf("%d\n", count( 10001));  // prints "3"
printf("%d\n", count(-10001));  // prints "3"

避免静态变量,因为多种原因,它们是有害的

唯一有效且不只是计算尾随零的算法是ring0的答案,但请注意,局部变量是免费的,显式代码不仅有助于读者,而且更易于维护

运行它

说明:

对于递归,需要一个收敛过程和停止条件。 第一个IF是基本情况。用3或-3除以10,结果总是0。这就是递归停止条件的结束

第二块和最后一块是可互换的。如果最右边的数字是0,则增加计数器,但是,还需要将所有数字的计数结果添加到左边。这是通过只播种你没有计算的部分来完成的,因此除以10就可以收敛


除法和模运算对于负数和正数都是一样的,所以在整数范围的两端都保持这种行为。

避免静态变量,它们是有害的,有多种原因

唯一有效且不只是计算尾随零的算法是ring0的答案,但请注意,局部变量是免费的,显式代码不仅有助于读者,而且更易于维护

运行它

说明:

对于递归,需要一个收敛过程和停止条件。 第一个IF是基本情况。用3或-3除以10,结果总是0。这就是递归停止条件的结束

第二块和最后一块是可互换的。如果最右边的数字是0,则增加计数器,但是,还需要将所有数字的计数结果添加到左边。这是通过只播种你没有计算的部分来完成的,因此除以10就可以收敛



除法和模运算对于负数和正数都是一样的,所以整数范围的两端都保持这种行为。

除了静态变量,还有其他方法吗?我认为静态变量不是最好的解决方案,调用它两次或从两个单独的线程调用,第二次运行将不会给出正确的结果。如果我们不能添加额外的调用参数,如count,该怎么办?我们只需要使用num。这还可能吗?我不是很确定。除了静态变量,还有其他方法吗?静态变量不是最好的解决方案,调用它两次或从两个单独的线程调用,第二次运行将不会给出正确的结果。如果我们不能添加额外的调用参数,如count,该怎么办?我们必须只使用num。这仍然可能吗?我不是很确定。使用静态变量。函数中静态变量集的内容在离开后保持不变。0应该给出什么作为答案?1?使用静态变量。函数中静态变量集的内容在离开后保持不变。0应该给出什么作为答案?1?对于这一点,它将在代码末尾返回一个0到主函数,并且在最后仍然显示一个0。是的,我尝试了,但它不起作用。我不知道为什么。不起作用。它只计算后面的零,而不是数字中的所有零。这就是问题中需要提到的。终止条件的微小更改将解决此问题。为此,它将在代码末尾向主函数返回一个0,并且在最后仍然显示一个0。是的,我尝试了,但它不起作用。我不知道为什么。不起作用。它只计算后面的零,而不是数字中的所有零。这就是问题中需要提到的。终止条件的微小更改将解决此问题。您的代码可以工作,但是否可以解释递归部分。我不明白。如果函数考虑递归函数,则代码工作,但是否可以解释递归部分。我不明白。如果函数考虑递归函数?