[英]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.