【问题标题】:Collatz chain recursive function CCollat​​z链递归函数C
【发布时间】:2023-05-03 14:01:01
【问题描述】:

我正在尝试创建一些代码,当给定一个起始数字时,它会尝试找到相应 collat​​z 链的长度。

我希望递归地做到这一点,这就是我目前所拥有的:

#include stdio.h

int collatz(int number, int count)
{
    if(number == 1)
    {
        return count;
    }
    if(number%2==0)
    {
    number = number/2;
    collatz(number, count+1);
    }
    else
    {
    number = number*3+1;
    collatz(number,count+1);
    }
    return 0;
}

int main(void)
{
    int stored=0;
    int temp;
    for(int i = 1;i<10;i++)
    {
        temp = collatz(i,1);
        if(temp>stored)
        {
            stored = temp;
        }
    }
    printf("%i\n",stored);
}

问题当然是函数最终到达了它的端点,但随后作为链的长度返回,这成为新的数字..

我如何构造这个程序,以便当计数到达其端点时,我可以将此值作为第一次调用的输出?

【问题讨论】:

    标签: c recursion collatz


    【解决方案1】:

    你需要返回递归调用的结果。现在您忽略递归调用的值并返回 0。每个递归调用应如下所示:

    return collatz(number, count+1);
    

    【讨论】:

    • 感谢您的回答。只是停留在同一个主题上,效果很好,但是我有点困惑,为什么我在使用整数时会出现分段错误,但是当我用“long long”替换所有整数时,它运行良好。你知道为什么吗?我将循环变量更改为最多迭代一百万。
    • 如果number 变成大于 715,827,882 的奇数会怎样?