在这里如何正确地增加变量?

时间:2018-10-10 18:20:30

标签: scheme lisp r5rs

(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)可以在一行中以'x 'y的形式打印2个符号,xyx的形式为n行1次。它可以正常工作。

我要用(teken-symbolen-combinatie x y n)完成的工作就是输出

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

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

编辑:更正问题中的错误

2 个答案:

答案 0 :(得分:0)

不会递增的是acc。函数+返回一个新值,它不更改其任何参数。

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

答案 1 :(得分:0)

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

(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将对其进行优化,使其运行 fast