【问题标题】:How to properly use a function that is recursive and receives a single argument?如何正确使用递归并接收单个参数的函数?
【发布时间】:2018-11-15 09:25:53
【问题描述】:

在尝试解决以下练习时...

定义函数binaryDigits,它接收一个整数和 返回以二进制形式写入此类数字所需的位数 代码。

...我发现自己认为不可能通过递归调用函数binaryDigits来解决这个问题,因为它接收的唯一变量是实际数字

我这样说是因为网站声明虽然它运行的测试成功,但我没有在函数 binaryDigits 中使用递归。

如果我什至不知道我调用了多少次,我怎么能想到递归调用这个函数(假设被调用的次数表示表示该数字需要多少二进制数字)。

这是我的想法:请注意,我正在使用递归,但在一个辅助函数中,当该列表的总和大于收到的号码:

double = (2*)

listOfBinaryDigits list num | num > (sum list) = listOfBinaryDigits ([double(head list)]++list) num
                            | otherwise = list

binaryDigits num = length (listOfBinaryDigits [1] num)

【问题讨论】:

  • 153 需要多少位数?现在你需要多少div 153 10 == 15?还是div 15 10 == 1?或div 1 10 == 0(提示:假设0 本身只需要0 位数字)。

标签: haskell recursion binary


【解决方案1】:

这是一个“迭代”解决方案:

binaryDigits = length . takeWhile (not . (==0)) . iterate (`div` 2)

你也可以通过递归来重新定义它,直到你到达底部并在返回的路上求和长度。这将是一个很好的练习,所以我为你保留了一个剧透中的解决方案

二进制数字 0 = 0;
binaryDigits x = 1 + binaryDigits (div x 2)

【讨论】:

    【解决方案2】:

    不需要递归或迭代。您也许可以使用以 2 为底的对数,如下所示;

    binaryDigits :: (Floating a, Integral c, RealFrac a) => a -> c
    binaryDigits n | n == 0    = 1
                   | otherwise = 1 + (floor . logBase 2 $ n)
    > binaryDigits 1453
    > 11
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-21
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 2010-10-04
      • 2015-05-22
      相关资源
      最近更新 更多