Exercise 1.41 ~ 1.44

本文探讨了如何通过定义函数来实现对数值的重复操作、组合应用及递归调用,涉及函数的二次操作、复合函数创建、重复应用以及平滑函数的方法。详细解释了如何利用已定义的函数进行数值的加一、平方等基本运算,并进一步展示了如何通过函数的复合与重复应用来实现更复杂的数学操作。
部署运行你感兴趣的模型镜像

1.41

定义一个 double 操作,用来将某个特定的操作重复两次。

例如我们有一个inc的操作会将某个数值加1,那么(double inc)则会将数值加二。

 

最终需要计算这个值:

 

写道
(((double (double double)) inc) 5)

 

下面是实现:

(defun db (f)
  (lambda (x)
    (funcall f (funcall f x))
    )
  )
(format t "~a~%" (funcall (funcall (db (db #'db))
                                   #'(lambda (x) (+ x 1)))
                          5))

 在我这里,运行的结果是21.

 

1.42

编写一个 compose 方法,它接收两个方法f、g,然后返回一个新的方法,这个方法对参数x,返回值 f(g(x)).

 

实现的方法比较简单,只需要依次调用两个方法就可以了。

 

(defun inc (x) (+ x 1))
(defun squar (x) (* x x))
(defun compose (f g)
  (lambda (x)
    (funcall f (funcall g x))))
(format t "~a~%" (funcall (compose #'squar #'inc) 6))

 

1.43

在平时的使用场景中,我们经常需要将一个函数的返回值,做为它自身的输入。比如,对函数f(x), 经常需要求值: f(f(...f(x)...)). 所以应该可以写一个方法repeated,他接受两个参数,一个函数f和一个计数n,返回的方法对给定的参数x,会执行n次函数f。 了解这些啰嗦的描述后,写起来倒是很简单。这里正好用到了1.42的compose函数。让f=g,compose方法相当于将函数f repeat了两次。

#1.43
(defun repeated (f count)
  (if (< count 2)
      (lambda (x) (funcall f x))
    (compose f (repeated f (- count 1)))
)
  )
(format t "~a~%" (funcall (repeated  #'squar 2) 5))

 

1.44

为了需要smoothing一个函数,对于x,需要求值(f(x) + f(x-dx) + f(x+dx))/3.我们需要编写一个方法,他的参数是一个函数,返回值是smoothing之后的函数。

(defun smooth (f)
  (let ((dx 1.0))
    (lambda (x)
      (/ (+ (funcall f (- x dx))
            (funcall f x)
            (funcall f (+ x dx)))
            3.0)))
)
(format t "~a~%" (funcall (smooth #'squar) 5))

 

如果你想对某个函数smoothing n次,就可以使用前面的repeat方法了:

(defun nth-smooth (f n)
  (lambda (x)
    (funcall (funcall (repeated #'smooth n) f) x)
    )
)
(format t "~a~%" (funcall (nth-smooth #'squar 2) 5))

因为我们重复的时“smooth”这个操作,所以首先对smooth方法执行 repeated操作n次,然后将f传值给前面返回的方法,就得到了我们想要的nth-smooth方法了。

 

这里跟前面两个题目不同的一点是,前面repeated之后的得到的方法,会返回一个值;这里repeated之后返回的方法,返回值仍然是一个方法。

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 解决方案 当遇到 `make` 命令错误 `'No targets specified and no makefile found'` 时,这通常意味着当前目录下缺少有效的 Makefile 或未指定目标。以下是可能的原因以及解决方案: #### 可能原因 1. 当前工作目录中不存在名为 `Makefile` 的文件。 2. 存在多个同名文件(如大小写差异),例如 `makefile` 和 `Makefile`[^1]。 3. 使用了 `-f` 参数指定了自定义名称的 Makefile,但该文件实际并不存在。 #### 解决方法 - **确认是否存在 Makefile 文件** 首先检查当前路径是否有 `Makefile` 文件存在。可以运行以下命令来查找: ```bash ls -l | grep Makefile ``` - **创建或修复缺失的 Makefile** 如果确实没有找到任何符合条件的构建脚本,则需要手动编写或者下载对应的模板作为基础版本。一个简单的例子如下所示: ```makefile all: target_name target_name: @echo "Building Target..." ``` - **切换至正确的项目根目录再尝试重新调用指令** 若已知项目的源码结构复杂且包含子模块,请确保自己处于顶层位置后再继续操作[^2]: ```bash cd /path/to/project_root && make clean all ``` - **针对特定环境调整链接器设置** 对于某些老旧 Linux 内核编译场景下的特殊需求,可考虑替换默认使用的 GNU Binutils 工具链中的 ld.gold 成分回退成传统形式bfd实现方式以规避潜在兼容性障碍[^3]: ```bash export LD="${CROSS_COMPILE}ld.bfd" make -j$(nproc) uImage modules dtbs | tee build.log ``` 上述措施能够有效应对大部分常规状况引发的相关报错现象;然而如果问题依旧持续发生则建议进一步深入排查具体依赖关系配置细节部分[^4]。 ```python def check_makefile_exists(directory): import os files = os.listdir(directory) return any(f.lower() == 'makefile' for f in files) current_dir = './' if not check_makefile_exists(current_dir): print("Error: No Makefile detected.") else: try: result = subprocess.run(['make'], capture_output=True, text=True) if result.returncode != 0: raise Exception(result.stderr.strip()) else: print("Success:",result.stdout.strip()) except Exception as e: print(e) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值