for-loop - APL 编程 - 为向量赋值

标签 for-loop vector apl

最近,我一直在尝试进入 APL。然而,我经常遇到的一个问题是为向量赋值。

对于某些我打算获得多个结果的程序(例如,将一个字符或一串字母转换为 8 位二进制向量的程序),我尝试制作一个临时的 for 循环,然后分配 i我的范围向量的第一部分具有正确的值。例如,使用 char->bin 向量程序:

r = 8[rho]' ' (creates a vector of length 8 with only blank spaces)
i = 8
e = [the numerical value of character c]
a1: r[8-i] <- 1
r[8-i] <- 0(if)(0=2|e)
e <- (floor value of e/2)
i = i - 1
->a1(if)i != 1

但是,每次尝试此操作时,我都会在为 r[x] 赋值的行处收到长度错误。我的程序出了什么问题,该如何修复?

最佳答案

  1. 您使用的是哪种 APL 实现?大多数 APL-Venoders(据我所知)现在都支持 Unicode,要么直接在 Unicode 中复制和粘贴,要么提供将 APL 转换为 unicode 的方法...然后您可以将其粘贴到此处,而不是转录它...
  2. 您说过您仍在进入 APL。 APL 的一个关键方面是“数组思维”。使用 AT,您不需要循环遍历向量的元素,而是可以立即使用向量。
  3. 您可以改进的另一个方面是控制结构。如今大多数 APL 都提供了一些 cs 风格 - 这就是我问 1 的原因。
  4. 您的作业存在的问题是您没有显示的 if 函数。但通常情况下,如果条件为真,if 函数将返回其正确的参数,否则返回空向量。因此,在您的情况下,当不满足条件时,您尝试将一个空向量插入到数组的位置 - 但那里只有标量是可接受的(除非您使用嵌套数组,这对于这个问题来说完全是矫枉过正) .

所以,这是一个与您的版本相当接近的版本,但使用控制结构并将给定的数值转换为二进制:

 r←foo c;i;⎕IO;res
 ⍝ Converts integer value c to binary (loopy-version)
 ⎕IO←0
 i←7
 r←8⍴0
 :if (i>255)∨(i≠⌊i)∨i<0 ⋄ r←¯1 ⋄ :endif  ⍝ some cases we do not want to handle and return ¯1 to indicate error
 :While i≥0
     res←1=⌊c÷2*i
     r[7-i]←res
     c←c-res×2*i
     i-←1
 :EndWhile

但是,提供此解决方案只是为了说明实现 APL 中某些常规方面的一些方法(并为您提供学习 APL 时需要了解的一些内容)。对于给定的问题,“真正的”APL 解决方案将是 (8⍴2)⊤number

最后,如果您不仅想“进入”APL,而且对掌握 APL 感兴趣,可以从 http://dyalog.com/mastering-dyalog-apl.htm 找到一本具有该确切标题的书;-)(免费下载!)您还可以在其中找到其他有用的链接和免费的学生版本...

关于for-loop - APL 编程 - 为向量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25985209/

相关文章:

map - 两个嵌套for of for 和map?

c# - 循环中 Enumerable Count 方法的性能

C++ 如何断言 vector 中的所有 std::shared_ptr 都引用了某物

APL 组件文件与 native 文件和。数据库

php - APL 中的爆炸和内爆

function - 在 APL 中将函数作为参数传递

java - 计算并返回 FizzBu​​zzProblem 中 3*f+5*b-15*fb 的值

c - 我无法显示最大 PSI 值对应的区域

c++ - 向 std::vector 或 typedef 添加自定义方法

c++ - operator+ 和 operator= 的运算符重载 C++