如何递归使用函数?

时间:2015-10-31 02:00:30

标签: c recursion sum

我有一个程序,提示用户输入最多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.

pnorm(176, 135, 10, lower.tail=TRUE) - pnorm(146, 135, 10, lower.tail=TRUE)

1 个答案:

答案 0 :(得分:1)

首先,我只想提一些事情,第一个是语句a % 1 == 0对于任何正整数a总是如此,所以它不应该用于有条件的,另一个是你应该尝试避免在magic的for循环中使用102数字,例如sum_divisors;有一个更自然,更通用的值可用于替换102,我想使用这样的常数会导致更大的数字更大的悲伤,其大于102的除数将无法计算。

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

  • 由于你只想打印除数的总和,我看不出任何理由让sum_divisors返回一个值(可能接受它重复的次数),所以返回值为{{ 1}}似乎更合适。
  • 让我们摆脱void并将基本情况更改为。

    (a%1==0)&&(a!=1)

    以便该函数知道何时停止

  • 正如我之前所说,for循环可以更改为更通用,没有幻数。我们可以将 if( a <= 1 ) return; 替换为102,以省略将a-1计为除数,而不是a
  • 检查a是否是一个完整的数字
  • 现在请求递归调用a!=z

另一件事是将sum_divisors( total );初始化为总数,因此我们不需要将total = 1视为基本案例的例外。

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

a=1

与你最初的情况没什么不同