如何在 Scratch 中编写阶乘?

问题描述 投票:0回答:2

因此,我从 Scratch 中的 PvZ 项目中休息一下,并尝试看看我可以在 Scratch 中做什么。所以事情是这样的:我有点想看看我是否可以制作一个从 sin(x°) 到 sin(xradians) 的转换器,这应该不会太难,除了下面的东西:sin(x 弧度)是 sin(πx°/180)

现在问题就出现了,因为这是 π 的表示:

<script type="text/x-mathjax-config"> MathJax.Hub.Config({ extensions: ["tex2jax.js"], tex2jax: {inlineMath: [["$","$"]]}, CommonHTML: { scale: 120 } }); </script> <script type="text/javascript" async src= "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config= TeX-MML-AM_CHTML"></script> $\sum_{k=0}^\infty\dfrac{50k-6}{2^k\binom{3k}k}$

这又简化为
<script type="text/x-mathjax-config"> MathJax.Hub.Config({ extensions: ["tex2jax.js"], tex2jax: {inlineMath: [["$","$"]]}, CommonHTML: { scale: 120 } }); </script> <script type="text/javascript" async src= "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config= TeX-MML-AM_CHTML"></script> $\sum_{k=0}^\infty\dfrac{k!(2k)!(50k-6)}{2^k(3k)!}$



现在这是我的问题:



我如何在 Scratch 中格式化它,因为 Scratch 没有代码块允许我这样做。我可能看到的唯一解决方法是,是否有一种方法可以在 Scratch 中创建求和和乘积。即使在这个网站上的“第一个”问题中,我想知道我能做什么,因为没有办法表示求和,但事实证明,我能做的最好的事情就是这样:

将内容提升到电源代码:


[scratchblocks] define pow(base)(power) set [result v] to [1] set [base v] to (base) set [power v] to (round (power)) set [done v] to [0] if <(power) < [0]> then set [base v] to [((1) / (base))] set [power v] to [-1(() *(round (power))] end repeat until <[done v] = [1]> if <(([power v]) mod (2)) = [0]> then set [result v] to (([result v]) * ([base v])) change [power v] by (-1) end if <(([power v]) mod (2)) > [0]> then set [done v] to [1] end if <<not <<[done v] = [1]>>> set [base v] to (([base v]) * ([base v])) set [power v] to (([power v]) / (2)) end end [/scratchblocks]

即使这样,如果我想写求和,我也必须单独写幂,老实说,在我看来这非常烦人。事实上,如果您确实想看看它是如何写出来的,
这里
是我在第一个问题中询问过的 Scratch 项目的链接。

为了避免人们生气并说它很难找到,一种快速找到它的方法是点击“Buy 10 (cursorSprite1”) 精灵(这甚至不是错字,这实际上是如何输入精灵名称)

事实上,我能想到的唯一方法就是尝试写出这个结果,就像写出求和一样:看起来很简单,但必须非常复杂才能以简单的方式工作。必须有很多变量/消息同时发出,这会导致很大的滞后。而且我什至不需要那么高的精度(只需要从 k=0 到 13 的总和),所以看起来它只是试图让阶乘发挥作用,这是一个诚实的痛苦。

我的问题

有没有一种方法可以在 Scratch 中创建阶乘,如果没有,为什么以及如何创建?

limit summary mit-scratch
2个回答
2
投票
不,没有内置阶乘函数。 但即使有这样的功能,为什么在这里需要它呢?

首先,当您在应用程序中需要 π 时(如您的情况,在度数和半径之间进行转换),您不会计算

π。 相反,您只需定义一个具有硬编码值 3.141592653589793 的常量。 这具有三个重要优点:

性能:硬编码 π 比计算 π 高效得多。

    准确性:考虑到几乎所有编程语言(包括 Scratch)中使用的浮点数的精度有限,舍入误差会在计算过程中累积。
  1. 简单:在应用程序代码中,这种计算基本上只是混乱。
  2. 即使你坚持要计算 π, 使用内置的
  3. arctan
函数更有意义, 出于同样的三个原因:性能、准确性、简单性。

如果您坚持仅使用非常基本的数学运算进行计算, 这篇 wiki 文章建议使用 pi=4*arctan(1)Leibniz 公式

:

https://en.scratch-wiki.info/wiki/Calculated_Pi

当然,编写自己的计算是完全有意义的,但只是出于数学好奇心或作为编码练习。

请记住

n!当 n 大于 170 时将会溢出。 因此,这将溢出 k > 56:

然而这需要更长的时间才能溢出。naive implementation

您甚至可以将其与 2 的幂结合起来。efficient implementation

伪代码:combined with power

denominator = 1 a = 6 * k b = k do k times denominator = denominator * (a / b) a = a - 2 b = b - 1

这是在 Scratch 中计算阶乘的一种方法。

1
投票
想想阶乘是如何计算的。从 n 开始,递减 1,直到达到 1,每次乘以新数字(例如:3!= 3x2x1)

这可以很容易地在 Scratch 中复制。我不知道 [scratchblocks] 的语法,但我在下面有一个项目链接。我希望这有帮助!

草稿块格式:

[scratchblocks] when green flag clicked ask [enter value for n] and wait return=(answer)! say (join (join (answer) [!=]) (return)) stop [all v] [/scratchblocks] [scratchblocks] define return=(n)! set [index v] to (n) set [return v] to [1] repeat ((n)) set [return v] to (([return]) * ([index])) change [index v] by (-1) end [/scratchblocks]

https://scratch.mit.edu/projects/939563834/

© www.soinside.com 2019 - 2024. All rights reserved.