2017-03-03 84 views
2

我想为递归函数做一个练习,并试图应用我对指针的新知识。锻炼要求我们使用考拉兹猜想得到任何正数回一个,但它要求计算从数步骤1使用带指针的递归函数

的算法如下:

  • 如果n == 1停止
  • 如果n为偶数然后重复n个该过程/ 2
  • 如果n是奇数重复此过程的(N * 3)+1

这是我试图声明一个int计数器并通过引用传递它该功能,所以我们可以指望有多少步骤需要花费数回1:

#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); 
    } 
} 

在编译时它显示我用它

error: expression result unused [-Werror,-Wunused-value] 
      *counter++; 
      ^~~~~~~~~~ 
+3

Postfix运算符比一元运算符具有更高的优先级。另外,编译器应该在返回'void'的函数中发布关于'return'的诊断。 – EOF

+0

您的问题标题与您的问题不符。 –

+2

'* counter ++;' - >>'* counter + = 1;'是避免括号的技巧。 – joop

回答

-1

无指针版本的三倍此错误尾递归。

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

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

return 1+collatz2(val); 
}