当前位置: 首页 > 知识库问答 >
问题:

计算数字位数的递归函数

马野
2023-03-14

是否有一种方法可以编写递归函数,该函数打印数字中的位数,以便:

-它是一个无效函数

-"if"条件是if(num==0),返回

-“else”将调用递归。

我看到了两种不同类型的代码,其中一种是“if”条件具有递归调用,另一种是用于“return”。但这不是我想要的。

我很不擅长递归,并试图通过自己编写代码来理解它,但没有成功。

这是我的代码(我明白为什么它打印122而不是3,但我真的不知道如何以不同的方式编码。帮助任何人?)

    #include <iostream>
    #include <string.h>
    using namespace std;
    void numOfDigits(unsigned int num);

    int main(){
        int num = 994;
        numOfDigits(num);
    }
    void numOfDigits(unsigned int num)
    {
        int size = 1;
        if (num==0)
            return;
        else
        {
            if (num / 10 != 0)
                size++;
            numOfDigits(num / 10);
        }
        cout << size;
    }

共有3个答案

邰建业
2023-03-14

您可以通过引用传递一个值并使用它,每次调用此函数时初始化ans=0

void recursive(unsigned int num,int &ans){
    if(num == 0){
        return;
    }
    else{
        ans++;
        recursive(num/10,ans);
    }
}

看这个还有这个

朱华皓
2023-03-14

您在numOfDigits()函数中有许多错误。

> < li >首先,每次调用函数时,都要声明一个名为size的新局部变量。这与调用函数中定义的“大小”无关。要看到这一点,请在初始化后打印size。若要解决此问题,请将大小设为静态;然后,每次您调用该函数时,它都会使用相同的静态变量。 < li>

当您在函数末尾打印尺寸时,它只是在函数运行后给出尺寸变量的值。即使将size设置为static,也将打印size的中间值。解决这个问题的一个简单方法是允许函数返回size,您只需在main函数中打印该函数的值。

#include <iostream>
#include <string.h>
using namespace std;
int numOfDigits(unsigned int num);

int main(){
        int num = 994;
        cout<<numOfDigits(num);
}
int numOfDigits(unsigned int num)
{
        static int size = 1;
        if (num==0)
            return 0;
        else
        {
            if (num / 10 != 0)
                size++;
            numOfDigits(num / 10);
        }
        return size ;
}

请确保按您的需要使用(num==0);在这种情况下,它打印0作为答案。

PS:打印数字后总要加个空格。否则你可能会认为1 2 2(实际上是打印出来的数字)是122。

苏选
2023-03-14

让这段代码工作的一个快速技巧是将< code>size设为静态,也就是更改

int size = 1;

static int size = 1;

但这只在你第一次调用这个函数时有效。

要获得更稳健的解决方案,在每次调用函数时,必须传递到目前为止的计数:

void numOfDigits(unsigned int num, int countSoFar = 0) {
    if (num == 0)
        std::cout << countSoFar << '\n';
    else
        numOfDigits(num / 10, countSoFar + 1);
}
 类似资料:
  • 我知道这个问题已经被问过很多次了,但是我的问题有点不同。这个任务要求我不验证一个字符串是否是回文——而是验证一个字符串中有多少回文(返回为“int”)。这应该使用迭代函数来完成 以下是我的迭代函数代码供参考: 我只是很难把它转换成递归函数。感谢所有帮助!

  • 定义一个接受1个参数的count_down函数。当你调用count_down(3)时,输出应该是这样的:3...2...1...0!。 我的代码如下: 但是输出是[3,2,1,0][4,3,2,1,0]如何获得如所讨论的格式所描述的格式:3...2...1...0!

  • 问题 你想在一个函数中调用相同的函数。 解决方案 使用一个命名函数: ping = -> console.log "Pinged" setTimeout ping, 1000 若为未命名函数,则使用 @arguments.callee@: delay = 1000 setTimeout((-> console.log "Pinged" setTimeout arg

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n x fact(n-1),

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n)=n!=1\times2\times3\times\cdot\cdot\cdot\times(n-1)\times n=(n-1)!\times n=fact(n-1)\times n

  • 我有一个家庭作业问题,它给出了一个递归函数,我必须使用尾部递归来实现它。函数为f(0)=1 f(n)=1 2*f(n-1) 我并不擅长尾部递归,我试着查找示例,但我发现的都是没有斐波那契序列的示例,这没有多大帮助。 我真正拥有的是 我知道尾递归基本上每次调用都计算函数,我只是不知道如何实现它。 编辑:我打了一个错字f(n)应该是1 2*f(n-1)