递归早期阶段

问题描述 投票:-1回答:3
static int counter;

int collatz(int n)
{
    if(n==1)
        return counter;

    else if(n%2==0) //if n is even
    {
        counter += 1;
        collatz(n/2);
    }
    else
    {
        counter += 1;
        collatz(3*n+1);
    }
}

我从递归开始。首先,我做了一个阶乘计划,现在这个。

为什么我得到错误控制可能会达到非空函数的结束

c++ function recursion
3个回答
1
投票

如果最初n不等于1,虽然函数的返回类型为int,但函数不会返回任何内容。

而且它太复杂并且使用全局变量。

该功能可以看起来像在演示程序中显示的那样。

#include <iostream>

unsigned int collatz( unsigned int n )
{
    return n < 2 ? 0 : 1 + collatz( n % 2 ? 3 * n + 1 : n / 2 );
}   

int main() 
{
    std::cout << "collatz( 10 ) = " << collatz( 10 ) << std::endl;

    return 0;
}

它的输出是

collatz( 10 ) = 6

考虑到最好使用无符号整数类型作为参数的类型并返回值而不是有符号整数类型。并且不要忘记参数可以设置为0


1
投票

你应该把return放在if语句给出的所有可能结果上

static int counter;

int collatz(int n)
{
    if(n==1)
        return counter;

    else if(n%2==0) //if n is even
    {
        counter += 1;
        return collatz(n/2);
    }
    else
    {
        counter += 1;
        return collatz(3*n+1);
    }
}

1
投票

您必须从函数int返回int collatz(int n)值。如果n不是1,你不会从函数int collatz(int n)返回任何值。

要解决此问题,请在函数return中添加int collatz(int n)语句。以下是更正后的代码:

int collatz(int n)
{
    if(n==1)
        return counter;

    else if(n%2==0) //if n is even
    {
        counter += 1;
        return collatz(n/2);
    }
    else
    {
        counter += 1;
        return collatz(3*n+1);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.