簡體   English   中英

C中的遞歸函數如何工作

[英]How does recursive function in C works

函數fun(n)定義如下:

fun(n) = 1                 (if n <=1)
fun(n) = fun(n/2)          (if n is even)
fun(n) = 2*fun((n-1)/3)    (if n> and n is odd)

我正在嘗試編寫一個遞歸函數來計算並返回結果。 我剛開始學習遞歸,我在做這個功能時有點迷失。 有人可以糾正我並向我解釋一下嗎? 謝謝!

這是我做的:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <math.h>

int fun(int n);

int main()
{
    int num;

    printf("\nEnter a number: ");
    scanf("%d", num);
    printf("Result = %d\n", fun(num));
    return 0;
}

int fun(int n)
{
    if (n <= 1)
    {
        return 1;
    }

    else if (n % 2 == 0)
    {
        return fun(n / 2);
    }

    else if ((n > 1) && (n % 2 == 0))
    {
        return 2 * fun((n - 1) / 3);
    }
}

預期產量:

Enter a number: 13
Result = 2

Enter a number: 34
Result = 4

輸出我得到了:

Enter a number: 13
Result = 1

Enter a number: 34
Result = 1

scanf指向 int指針作為%d參數,即

scanf("%d", &num);

此外,您的功能fun並不處理所有情況,可能會從底部掉下來:

if (n <= 1)
{
    return 1;
}
else if (n % 2 == 0)
{
    return fun(n / 2);
}
else if ((n > 1) && (n % 2 == 0))
{
    return 2 * fun((n - 1) / 3);
}

從不滿足最后一個else if條件,因為在這種情況下,先前檢查n % 2 == 0已經返回。 此外, n > 1是沒有意義的,因為在所有其他情況下,第一個n <= 1返回。

你可以簡單地做到:

else
{
    return 2 * fun((n - 1) / 3);
}

罪魁禍首是最后else if條件。 將其更改為:

else if ((n % 2) != 0)

n為奇數的條件在這里寫錯了。 你寫了與n是偶數時相同的東西。

它可能更好地明確地使案例不相交,所以你總是返回並且沒有警告,如下所示:

int fun(int n)
{
    if(n <= 1)
        return 1;
    if(n % 2 == 0)
        return fun(n/2);
    //No need for a condition, we know the last one must be satisfied
    return 2 * fun((n-1)/3);
}

或者,添加另一個“默認”案例,表明存在一些錯誤。

我想,最后if應該是:

else if ((n > 1) && (n % 2 != 0))

注意!=而不是==

第三個條件

else if ((n > 1) && (n % 2 == 0))

是錯誤的,但,而不是修復它只是你else沒有else if -因為所有其他條件已經檢查。

暫無
暫無

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

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