2017-03-03 115 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); 
}