使用带指针的递归函数

时间:2017-03-03 18:17:07

标签: c pointers recursion pass-by-reference cs50

我试图为递归函数做练习,并尝试应用我对指针的新知识。练习要求我们使用Collat​​z猜想将任何正数反馈给一个,但它要求计算从该数字到1的步数

算法如下:

  • 如果n == 1停止
  • 如果n是偶数,则在n / 2
  • 上重复此过程
  • 如果n为奇数,则在(n * 3)+1
  • 上重复该过程

这是我尝试声明一个int计数器并通过引用函数传递它,这样我们就可以计算重新计算到1的步数:

Ctrl-L

编译时,我在三次使用它时显示此错误

#include <cs50.h>
#include <stdio.h>

void collatz (int n, int *counter);

int main (void)
{
    printf("n:  ");
    int n = get_int();
    int counter = 0;

    collatz(n, &counter);
    printf("%i\n",counter);
}

void collatz (int n, int *counter)
{
    if (n == 1)
    {
        *counter++;
        return;
    } else if (n % 2 == 0)
    {
        *counter++;
        return collatz(n/2, counter);
    }else if (n % 2 != 0)
    {
        *counter++;
        return collatz((n * 3) + 1, counter);
    }
}

1 个答案:

答案 0 :(得分:-1)

带尾递归的无指针版本。

unsigned collatz2(unsigned val)
{
if (val <= 1) return 0;

if (val%2) val = val*3 +1;
else val /= 2;

return 1+collatz2(val);
}