【问题标题】:Printing each number in new line in Scheme在方案中以新行打印每个数字
【发布时间】:2021-11-13 10:49:10
【问题描述】:

我需要帮助来将此 Pascal 代码转换为 Scheme 代码:

program reverseorder;
type
arraytype = array [1..5] of integer;

var
arr:arraytype;
i:integer;

begin

for i:=1 to 5 do
    arr[i]:=i;

for i:=5 downto 1 do
    writeln(arr[i]);
    
end.

我想访问一个特定的原子,它似乎在 Scheme 中没有迭代方法。

【问题讨论】:

  • Scheme 中有很多方法可以遍历列表:) 你使用的是什么解释器?球拍,切斯,其他?
  • 我使用了这个在线解释器(gauche):tutorialspoint.com/execute_scheme_online.php
  • 哎呀,这并没有给我们太多选择,它是 Scheme 标准的基本实现,很少有循环结构,不是学习语言恕我直言的最佳方式。最好下载一个功能更多的解释器,我建议初学者使用 Racket。

标签: arrays printing scheme


【解决方案1】:

有很多方法可以解决这个问题。使用您使用的在线解释器,您将被限制为 vanilla Scheme,并且使用递归,解决方案将比需要的更冗长:

(define lst '(1 2 3 4 5))

(let loop ((rev (reverse lst)))
  (when (not (null? rev))
    (display (car rev))
    (newline)
    (loop (cdr rev))))

使用针对初学者的 Racket,您可以编写一个更简单(尽管非标准)的解决方案:

(define lst (range 1 6))

(for ([e (reverse lst)])
  (displayln e))

无论哪种方式,请注意反转列表的过程已经内置在该语言中,您不需要重新实现它 - 自然地,它被称为reverse。如果还不是很明显,在 Scheme 中我们更喜欢使用 lists,而不是数组来表示元素序列 - 建议停止考虑索引、数组长度等,因为那是而不是在 Scheme 中是如何完成的。

【讨论】:

  • 感谢您的提示。因为我正在学习CS领域的课程,我需要具备功能语言的基础知识。这就是为什么我必须使用标准方案。
【解决方案2】:

如果你不关心返回值(它是#<undef>)而只想产生输出,你可以使用for-each

(for-each print (reverse (list 1 2 3 4 5)))

Output:
5
4
3
2
1

【讨论】:

    【解决方案3】:

    不是惯用的 Scheme,而是 Pascal 代码的直译:

    (let ([arr (make-vector 5)])
         (do ([i 0 (+ i 1)]) ((= i 5)) (vector-set! arr i i))
         (do ([i 4 (- i 1)]) ((negative? i))
             (display (vector-ref arr i))
             (newline)))
    

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2013-06-16
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多