我必须创建一个递归函数,以递归方式查找从0到n的数量。
所以f(16)= 9
(1,10,11,12,13,14,15,16)
这显然是功课,所以如果你没有发布任何代码,我会很感激,只是背后的原因。
到目前为止我所推断的是,如果你做一个数字的%10,它会告诉你最低有效数是否为1,如果你用10除以整数除数,你就会失去那个数字。
所以我猜测方法可以检查if number%10 == 1
然后用f(n / 10)调用函数,但后来我在实际实现中迷失了。
如果你能评论你会使用什么方法,我会很感激,它必须是递归的,因为它是家庭工作,程序方法是微不足道的。
答案 0 :(得分:2)
对于这些类型的问题,我发现编写某种显示模式的图表会有所帮助。例如,如果你数十,你知道第一组(0-9)包含一个1.
(0-9) - 1
(10-19) - 11
(21-29) - 1
| | - 1
(100-109) - 11
(110-119) - 21
(120-129) - 11
| | - 11
(200-209) - 1
(210-219) - 11
(220-229) - 1
| | - 1
...
(1000-1009)等......
这可能需要一段时间,但这有助于您找到模式,以便您可以提出更具体验性的答案。我不想给你很多帮助,因为这是一个家庭作业问题,但这就是我在解决创造性数学问题时采取的方法。
答案 1 :(得分:1)
你的方法很正确。对于每个数字,您需要一个函数,该函数将返回十进制表示中的“个数”。这个的递归表示(注意你也可以迭代地执行此操作)。
与所有递归函数一样,您需要结束状态捕获,即,如果输入= 0,则返回0.除此之外(不全部放弃),您只需将当前结果添加到子结果:< / p>
if number==0
return 0
if number%10==1
return myFunc(number/10) + 1
else
return myFunc(number/10)
但是,正如我之前所说,没有必要使用递归。这里的迭代解决方案可能更好,因为函数相对于位数是线性的。
答案 2 :(得分:1)
你的问题有两部分。
第一部分:
如果最右边的数字是1,那么number % 10 == 1
。
如果数字是> 9你需要检查其他数字,你可以通过对整数除以10之后的数字进行相同的测试来做到这一点。如果数字<= 9,那么这将给你零。
所以你的OnesInNumber函数有点像:
number / 10
上调用OnesInNumber。number % 10 == 1
为该结果添加1。例如,这会在1
,10
,1
,12
上给您303212
时给您2
呼叫11
,依此类推。
您的OnesInZeroUntil功能如下:
number - 1
上致电OnesInZeroUntil。OnesInNumber(number)
添加到此。所以你有一个递归函数可以计算出一个数字中1
的数量,另一个递归函数可以计算出每个数字中1
的数量,并建立在第一个功能。
如果你没有要求我们不这样做,那就足够写一个快速的2个函数了。
(提示:如果你的老师还没有要求它,看看你是否可以在没有递归的情况下解决这个问题。每个递归函数都可以重写为非递归形式,这是一个实用的技巧。能够做到这一点,一些人教授递归似乎没有覆盖)。