如何在C中递归地检查给定数字是否是完美数字

How to check if a given number is a perfect number recursively in C

我有关于在 C 中编写递归函数的硬件,returns 0 或 1 基于给定数字是否为完美数字。
完美数是等于其约数之和的数。例如,6 等于 (1 + 2 + 3),因此它是一个完全数。
我已经设法编写了一个递归函数来计算给定数字的除数之和,但输出是除数之和,而不是 0 或 1。我对如何编写 returns 的递归函数一无所知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);

}

注意 1 不是一个完美的数字。在决定一个数字是否完美时,所有除数的总和不包括数字本身。 0 也不完美,因为完美数必须是正数。

if (n < 2) return 0;

假设将除数的累加和传递给函数。然后,当你到达停止点时,你 return 总和是否等于数字。为了简化这个逻辑,停止点可以是你的候选除数达到 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);