- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在复习几周后要回答的一个考试的旧试题,下面的问题让我陷入了困境:
一个有限的位序列被表示为一个列表,其中的值来自集合{0,1}-例如,[0,1,0],[1,0,1,1]。
[]表示空列表,[b]是由一位b组成的列表。对于非空列表l,head(l)返回l的第一个元素,tail(l)返回从l中删除第一个元素获得的列表。
A:L表示在列表L的开头添加A形成的新列表。
例如:
•头部([0,1,0])=0,尾部([0,1,0])=[1,0],
•头([1])=1,尾([1])=[],和
•1:[0,1,0]=[1,0,1,0]。
考虑以下功能:
•f1将一个列表作为输入并返回另一个列表。
f1(s):
if (s == []) then return([1])
else if (head(s) == 0) then return(1:tail(s))
else if (head(s) == 1) then return(0:f1(tail(s)))
endif
f2(b,s):
if (s == []) then return(b)
else if (head(s) == 0) then return(f2(not(b),tail(s)))
else if (head(s) == 1) then return(not(b))
endif
g1(n):
if (n == 0) then return([0])
else return f1(g1(n-1))
endif
g2(n):
if (n == 0) then return(0)
else return f2(g2(n-1),g1(n))
endif
最佳答案
纸笔评估
最好的方法就是开始。获取前面函数的定义并开始纸笔评估。这个问题要求我们比较g2(7)
和g2(8)
,但是观察g2
我们发现我们需要理解f2
和g1
,所以让我们从这里开始。因为g1
的值是首先计算的,所以我们将首先熟悉g1
我只想把一些价值观推进去,然后得到结果。我将从0
开始,因为在查看g1
之后,这似乎是最容易计算的
g1(0) => [0]
g1(1) => f1(g1(0)) => ... stop, do not recompute `g1(0)` here, we already know the answer above
=> f1([0])
=> [1]
g1(2) => f1(g1(1)) => we already know `g1(1)` from above
=> f1([1])
=> 0 : f1([])
=> [0,1]
g1(3) => f1(g1(2)) => we already know `g1(2)`
=> f1([0,1])
=> [1,1]
g1(4) => f1(g1(3)) => reuse `g1(3)`
=> f1([1,1])
=> 0 : f([1]) => we already know `f1([1])`
=> 0 : [0,1]
=> [0,0,1]
g1
正在为
little endian bit order中的
n
生成1和0的二进制序列
g1(0) => [0]
g1(1) => [1]
g1(2) => [0,1]
g1(3) => [1,1]
g1(4) => [0,0,1]
g1(7) => ?
g1(8) => ?
[1,1,1]
和
[0,0,0,1]
我们继续看看是否正确。。。
g1(5) => f1(g1(4))
=> f1([0,0,1])
=> [1,0,1]
g1(6) => f1(g1(5))
=> f1([1,0,1])
=> [0,1,1]
g1(7) => f1(g1(6))
=> f1([0,1,1])
=> [1,1,1]
g1(8) => f1(g1(7))
=> f1([1,1,1])
=> 0 : f([1,1]) => we already know f1([1,1])
=> 0 : [0,0,1]
=> [0,0,0,1]
g1
和
f1
是如何工作的。我们对
g1
的理解稍微好一点,因为我们知道它只需要一个数字,然后吐出二进制位序列来表示输入的数字。
f1
在它的工作方式上有点神奇,但最酷的是它并不重要——这个问题要求我们比较
g2
的值,因此只要我们能够计算
g2
的值,那么我们是否对其他函数有很好的理解并不重要。
g1
给了我们一些关于
f1
的有价值的见解,看起来与
g2
相关的
f2
的情况是一样的。现在我们有了一些可以引用的
g1
值,让我们尝试计算一些
g2
值–我将像上次一样从
0
开始
g2(0) => 0
g2(1) => f2(g2(0),g1(1)) => we already know `g2(0)` and `g1(1)`
=> f2(0, [1])
=> 1
g2(2) => f2(g2(1), g1(2)) => we already know these!
=> f2(1, [0,1])
=> f2(0, [1])
=> 1
g2(3) => f2(g2(2), g1(3))
=> f2(1, [1,1])
=> 0
g2(4) => f2(g2(3), g1(4))
=> f2(0, [0,0,1])
=> f2(1, [0,1])
=> f2(0, [1])
=> 1
g2
可能会告诉我们给定的整数是偶数还是奇数,但事实并非如此我在想的另外一件事是,对于2的幂,它返回
1
,对于2的非幂,它返回
0
。这是一个奇怪的函数。让我们继续找出
g2(5) => f2(g2(4), g1(5))
=> f2(1, [1,0,1])
=> 0
g2(6) => f2(g2(5), g1(6))
=> f2(0, [0,1,1])
=> f2(1, [1,1])
=> 0
g2(7) => f2(g2(6), g1(7))
=> f2(0, [1,1,1])
=> 1
g2(8) => f2(g2(7), g1(8))
=> f2(1, [0,0,0,1])
=> f2(0, [0,0,1])
=> f2(1, [0,1])
=> f2(0, [1])
=> 1
g2(7) == 1
和
g2(8) == 1
。我们的2次方理论肯定没有成功,但我们可以看到另一个模式已经出现-
g2
如果位序列包含奇数个
1
s,则返回
1
,如果位序列包含偶数个
0
s,则返回
1
。
g1(0) => [0] ones(0) => 0 odd?(ones(0)) => 0 g2(0) => 0
g1(1) => [1] ones(1) => 1 odd?(ones(1)) => 1 g2(1) => 1
g1(2) => [0,1] ones(2) => 1 odd?(ones(2)) => 1 g2(2) => 1
g1(3) => [1,1] ones(3) => 2 odd?(ones(3)) => 0 g2(3) => 0
g1(4) => [0,0,1] ones(4) => 1 odd?(ones(4)) => 1 g2(4) => 1
g1(5) => [1,0,1] ones(5) => 2 odd?(ones(5)) => 0 g2(5) => 0
g1(6) => [0,1,1] ones(6) => 2 odd?(ones(6)) => 0 g2(6) => 0
g1(7) => [1,1,1] ones(7) => 3 odd?(ones(7)) => 1 g2(7) => 1
g1(8) => [0,0,0,1] ones(8) => 1 odd?(ones(8)) => 1 g2(8) => 1
g2(x)
等于
odd?ones(x)
,至少在
0 <= x <= 8
的地方。评估
g2(0)
到
g2(8)
大约需要10分钟,分析模式可能需要5-10分钟,总共大约25分钟。但现在我们知道了在不进行所有繁琐的逐步递归的情况下计算
g(256)
和
g(257)
所需的一切
g1(256)
是
[0,0,0,0,0,0,0,0,1]
,同样
g1(257)
是
[1,0,0,0,0,0,0,0,1]
,所以现在很容易计算
g2(256)
并将其与
g(257)
进行比较
g1(256) => [0,0,0,0,0,0,0,0,1] ones(256) => 1 odd?(ones(256)) => 1 g2(256) => 1
g1(257) => [1,0,0,0,0,0,0,0,1] ones(257) => 2 odd?(ones(257)) => 0 g2(257) => 0
g2(7) => 1
g2(8) => 1
g2(256) => 1
g2(257) => 0
f2
将位
b
反转为列表中第一个1之前的0的次数。
s
有一些理解,但这有点问题,因为
f2
最初等于
b
假设我们要计算
g2(n - 1)
其中
f2(b, s)
是
b
。我们被困是因为我们还不知道那是什么不幸的是,这是对
g2(1234)
f2
和
g1
之间建立一个已知输入之间的相关性,这与
g2
或
f1
完全无关。一旦我能看到
f2
和
g1
是如何工作的,我甚至不需要计算
g2
或
f1
来评估
f2
和
g(256)
。这是一个巨大的收获,因为我有效地从纸笔评估模型中删除了
g(257)
和
f1
,并且仍然得到了
f2
和
g1
的正确答案。如果没有达到这一点,我将被困在寻找另一个相关性或手动评估一直到
g2
。这对考试来说太长时间了。
关于algorithm - 了解递归代码的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43696381/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!