我有這個關于在 C 中撰寫遞回函式的硬體,該函式根據給定數字是否為完美數字回傳 0 或 1。
完美數是等于其除數之和的數。例如,6 等于 (1 2 3),所以它是一個完美數。
我設法撰寫了一個遞回函式來計算給定數字的除數之和,但輸出是除數之和,而不是 0 或 1。我對如何撰寫回傳 0 或 1 的遞回函式一無所知同時計算除數之和并進行比較。
這是我輸出除數總和的代碼:
#include<stdio.h>
int check(int n, int b ){
if (n==1) {return(1);}
if (b==1) {return(1);}
else if ((n % b) ==0) {
return (b check(n,(b-1)));
}
else
return(check(n,(b-1)));
}
void main() {
int n,res,b;
scanf("%d",&n);
if (n % 2==0) {b=n/2;} else {b=(n/2) 1;}
res=check(n, b);
printf("%d est un nombre %d",n,res);
}
uj5u.com熱心網友回復:
請注意,1 不是一個完美的數字。在決定一個數是否完美時,所有除數的總和不包括該數本身。0 也不是完美的,因為完美的數字必須是正數。
if (n < 2) return 0;
假設除數的累積和被傳遞到函式中。然后,當您到達停止點時,回傳總和是否等于數字。為了使這個邏輯簡單,停止點可以是當你的候選除數達到 0 時。
if (b == 0) return sum == n;
您的遞回呼叫現在將檢查您的候選除數是否應添加到總和中。
assert(b > 0);
if ((n % b) == 0) sum = b;
return check(n, b-1, sum);
以這種方式實作,函式變為尾遞回。這將允許您的遞回函式由支持此優化的編譯器優化為一個簡單的回圈。
對您的函式的初始呼叫將傳遞 0 作為初始總和。
answer = check(n, n/2, 0);
在我自己的代碼中,我很想定義一個只接受單個引數的輔助函式。
int check_if_perfect(int n) { return check(n, n/2, 0); }
這樣,呼叫者就不必擔心其他引數。
answer = check_if_perfect(n);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449669.html
下一篇:MariaDB中的遞回父子問題
