【问题标题】:In Scheme, how can I write an iterative multiplication code (iter-multiply a b)在 Scheme 中,如何编写迭代乘法代码(iter-multiply a b)
【发布时间】:2022-10-05 01:27:12
【问题描述】:

这是递归的

(define (rec-multiply a b)
  (if (= b 0)
      0
      (+ a (rec-multiply a (- b 1)))))

【问题讨论】:

  • Scheme 没有迭代循环结构
  • @WillNess do 扩展为递归函数。
  • @Shawn 当然,但从用户/程序员的角度来看并不重要。此外,我还认为任何语法上的尾递归函数都表示迭代。
  • @Shawn由于Scheme具有尾调用优化递归,只要它位于尾部位置,它就会迭代。

标签: scheme


【解决方案1】:

Scheme 可以提供named let,类似于for 循环。

在 C++ 中,代码看起来像这样:

int mult (int x,int y) {
    int prod=0;

    for(int i=x; i>0; i--) {
        prod = prod + y;
    }
    return prod;
}

等效的方案是这样的:

(define (mult x y)
  (let loop ((times x) (prod 0))
     (if (> times 0)
          (loop (- times 1)(+ prod y))
          prod)))

named let 在 let 之后有一个附加标签,这里是 loop。在let 中定义了初始值,随后在调用loop 时提供了新的更新值,然后我们回到循环的开头。如果times 达到零,则返回结果prod

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2020-02-19
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2016-09-22
    • 2020-08-24
    相关资源
    最近更新 更多