簡體   English   中英

使用帶指針的遞歸函數

[英]using recursive function with pointers

我正在嘗試進行遞歸函數的練習,並嘗試應用新的指針知識。 練習要求我們使用Collat​​z猜想將任何正數恢復為1,但是它要求計算從該數到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);
    }
}

編譯時,在我使用過3次后會顯示此錯誤

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

帶有尾遞歸的無指針版本。

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

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

return 1+collatz2(val);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM