【问题标题】:How to have an increasing variable correctly here?如何在这里正确地增加变量?
【发布时间】:2018-10-10 18:20:29
【问题描述】:
(define (teken-n x y n)
  (if (not (zero? n))
      (begin
        (teken-symbolen x y)
        (teken-n x y (- n 1)))))

(define (teken-symbolen-combinatie x y n)
  (if (not (zero? n))
      (begin
        (let ((acc 0))
          (teken-n x y (+ acc 1))
          (newline)
          (teken-symbolen-combinatie x y (- n 1))))))

(teken-n x y n)的用途是在1行打印2个符号'x 'y,格式为xyx n次,不带空格。它工作正常。

我试图用(teken-symbolen-combinatie x y n) 完成的将是输出

(teken-symbolen-combinatie '- '* 3)
-*-
-*--*-
-*--*--*-

我的代码只给出了第一个符号组合,在这个例子中 -*- 3 次用换行符分隔。这意味着我的第一个函数的最后一个变量没有正确递增。我不知道为什么。

编辑:更正问题中的错误

【问题讨论】:

  • 其中一个答案是否解决了您的问题?您需要更多帮助吗?

标签: scheme lisp r5rs


【解决方案1】:

没有增加的是acc。函数+ 返回一个新值,它不会改变任何参数。

Scheme 中的常用方法是让一个内部循环具有另一个变量(这似乎是您的acc 的用途)增加到n。你不需要有外部函数循环。

【讨论】:

    【解决方案2】:

    这可能是您正在寻找的(未经测试;我没有您的其他功能)

    (define (teken-symbolen-combinatie x y n)
      (define (loop acc)
        (if (not (= acc n))
        (begin
          (teken-n x y (+ acc 1))
          (newline)
          (loop (+ acc 1)))))
      (loop 0))
    

    这使用了@Svante 关于创建内部循环的建议:这里是一个名为loop 的递归函数,它使用递增计数器调用自身。定义后,外部函数以初始值 0 触发循环。

    这是 Scheme 中非常常见的模式:在另一个函数中定义一个函数,它通过递归调用自身来像循环一样工作。如果内部循环是尾递归的,Scheme 将对其进行优化,使其运行快速

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多