gpt4 book ai didi

c - 如何递归使用函数?

转载 作者:太空狗 更新时间:2023-10-29 17:26:01 26 4
gpt4 key购买 nike

我有一个程序可以提示用户最多输入 10 位数字。然后程序使用一个函数返回每个输入的数字减去自身的除数之和并显示它直到该数字等于 1 或 0。我的问题是函数在 45 的除数求和后停止。我在这里尝试使用递归,因为该函数将被调用“n”次,直到每次都等于 0 或 1。是什么让递归在这种情况下如此有用,我如何在这里应用它?这个函数的调用方式有什么我遗漏的吗?有人可以帮助我吗?

例如,

如果用户键入:25 -4 6 45(然后按回车键)

程序应该输出:

25 1 0

-4 0 0

6 6

45 33 15 9 4 3 1 0 0

6 是完美数的示例,会重复出现,因此如果出现完美数,则应停止对除数求和。当总和等于 0 时应该打印一次然后停止。此外 -4 超出范围,因此它也应该打印 0。必须大于 1。

#include<stdio.h>
#include<stdlib.h>

int main(void)
{

//Fields
int i=0, j=0, k=0, l=0, num = 0, x = 0, count = 0, total = 0, z = 0;
signed int b[11] = {0};
char discard;


//Prompt message
printf( "\n\nPlease enter your list of numbers: " );


//This while loop scans until the enter button is pressed
while(i < 11 && (scanf("%d%1[^\n]s", &b[i], &discard)) == 2)
{
++count;
i++;
}
puts("");
puts("");
//Display Factors

while(k <= count)
{
x=b[k];
num = sum_divisors(x);
printf("%d " , num);
k++;
puts("");
}


}//End of main

//function to sum the divisors together
int sum_divisors(int a)
{
int total = 0;
int z = 0;

printf("%d ", a);

if(a < 1)
{
total = 0;
}else
{
if((a%1 == 0) && a !=1)
total = total + 1;

for(z=2; z<102; z++)
{
if((a%z == 0) && a != z)
{
total = total + z;
}//if
}//for
}//end if/else statement
// printf("%d ", total);
return total;
}//end function sum_divisors

最佳答案

首先,我只想提及几件事,首先是声明 a % 1 == 0对于任何正整数总是为真 a , 所以它不应该在条件中使用,另一个是你应该尽量避免使用 magic数字,例如 102sum_divisors 的 for 循环中;有一个更自然、更通用的值可用于替换 102 ,而且我认为使用这样的常量会导致更多的麻烦,因为不会计算除数大于 102 的较大数字。

话虽这么说,你构建sum_divisors的方式非常接近它应该的样子,接受它缺少递归调用,因此只需要进行一些更改就可以使其递归。

  • 因为您只想打印除数之和,所以我看不出有任何理由使用 sum_divisors返回一个值(可能接受它重复出现的次数),因此返回值为 void似乎更合适。
  • 让我们摆脱那个(a%1==0)&&(a!=1)并将基本情况更改为。

      if( a <= 1 )
    return;

    让函数知道什么时候停止

  • 正如我之前所说,可以将 for 循环更改为更通用的循环,没有魔数(Magic Number)。我们可以替换 102a-1为了省略计数a作为除数,而不是 a!=z
  • 检查 a 是否为完美数
  • 现在调用递归调用,sum_divisors( total );

另一件事是初始化 total 这样 total = 1 , 所以我们不需要处理 a=1作为基本情况的异常(exception)。

一切都说完了,剩下的就是这个

void sum_divisors( int a ) 
{
int total = 1; // divisor sum of a
int z;

printf("%d ", a); // print value

if( a <= 1 ) // base case
return;

for( z = 2; z < a-1; ++z) // z < a-1 as to not include a in total
{
if( a%z == 0 )
{
total += z;
}
}
if( total == a ) // a is a perfect number so we're done
return;

sum_divisors( total ); // call sum_divisors recursively with a = total
}

这和你最初的没什么不同

关于c - 如何递归使用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33447316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com