没有定义" square"为什么这个功能慢?

时间:2016-08-01 11:44:09

标签: scheme sicp

此问题位于SICP(练习1.26) 它说没有#34; square"的定义,它运行得更慢。 它的目的是检查数字是否为素数。 这是更快的版本:

Scheme,Prime check,O(log n)

如果没有" square"的定义,请使用

(* (expmod base (/ exp 2) m)
   (expmod base (/ exp 2) m))

据说 O n

2 个答案:

答案 0 :(得分:2)

如果您不使用(expmod base (/ exp 2) m),则需要对square进行两次评估。如果您将结果与let绑定并将其传递给square,那么它的复杂性就会相同。

答案 1 :(得分:2)

不是$scope.setData = function(survey, choice) { var item = $filter('filter')(keepAllData, { surveyId: survey.id }); if (!item.length) { keepAllData.push({ 'surveyId': survey.id, 'choiceId': choice.id }); } else { item[0].choiceId = choice.id; } console.log(keepAllData); } 过程使得它更快,而是缓存中间值。使用square可以使它同样快:

let

关键是(let ((tmp (expmod base (/ exp 2) m))) (* tmp tmp)) 只进行一次。