Scheme if语句

use*_*123 1 recursion scheme if-statement racket

我一直在尝试编写返回矩阵转置的函数.所以输出的例子就是,(transpose (list '(1 2) '(4 5))) ;==> ((1 4) (2 5)) 这是我的功能:

(define transpose
  (lambda (m1)
    (if (null? (cadr m1))
        null
        (list (indiv (car m1) (cadr m1)) (transpose (rest m1)))))) 


(define indiv 
  (lambda (l1 l2)
    (if (empty? l1)
        null
        (list (list (car l1) (car l2)) (indiv (rest l1) (rest l2))))))
Run Code Online (Sandbox Code Playgroud)

indiv函数负责行递归,而transpose调用indiv函数来获取转置.我的问题是为什么不能 (if (null? (cadr m1))检查我是否到达了矩阵的最后一行?有没有办法在计划中检查这个?我不想用另一种方法来解决这个问题,我只是想知道这是否可行,如果是,那么如何?

Ósc*_*pez 6

这是一个相当常见的功能,实现它的通常方法是:

(define (transpose lst)
  (apply map list lst))
Run Code Online (Sandbox Code Playgroud)

可以lst看作是作为参数传递的列表列表map,并记住它map接受多个输入列表作为参数:

(map list '(1 2) '(4 5))
Run Code Online (Sandbox Code Playgroud)

现在很容易看出发生了什么:我们映射list所有参数并使用第一个输入列表的第一个元素和第二个输入列表的第一个元素构建子列表等.然后,我们将构建一个子列表第一个输入列表的第二个元素和第二个输入列表的第二个元素等等.并map在单个输出列表中收集所有子列表.你去!

'((1 4) (2 5))
Run Code Online (Sandbox Code Playgroud)