(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次。这意味着我的第一个函数的最后一个变量未正确递增。我不知道为什么。
编辑:更正问题中的错误
答案 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 !
!