我是Scheme和函数式编程的新手,所以请保持温和。 我试图实现一个带有列表和数据透视的函数,并返回一个包含以下2个列表的列表:
对于所有小于或等于枢轴的元素,
和一个大于枢轴的所有元素。
所以我编写了以下代码(EDITED(& WORKING)CODE - PROBLEM求解):
define helper (lambda (lst pivot)
(define lst1 null)
(define lst2 null)
(define my-split (lambda (lst pivot lst1 lst2)
(if (null? lst)
(list lst1 lst2)
(if (<= (car lst) pivot)
(my-split (cdr lst) pivot (cons (car lst) lst1) lst2)
(my-split (cdr lst) pivot lst1 (cons (car lst) lst2))))))
(my-split lst pivot lst1 lst2)))
我目前的问题是,lst1
和lst2
在运行结束时为null
,所以我猜问题是(cons (car lst) lst1)
&amp;行。 (cons (car lst) lst2)))
。
我在网上看到一些使用一些我不允许使用的复杂命令的实现(是的,它的家庭作业)。
请提供修改代码的方法,而不是提供自己的代码。
由于
答案 0 :(得分:1)
您正确识别出两个主要问题。 cons
只是构建并返回一个新列表,而您却试图改变变量lst1
和lst2
。正确的方法是(set! lst1 (cons (car lst) lst1))
和(set! lst2 (cons (car lst) lst2))
。但请记住,良好的函数式编程风格可以避免突变。在这种情况下,这样做的一个好方法是在你重复主列表时将两个子列表作为参数传递,然后在结束时返回它们。
答案 1 :(得分:1)
就像Java中的str.concat("hey")
这样的表达式并没有改变str
(cons 1 lst1)
lst1
不会改变(define (count-odds lst)
(define (helper lst odds)
(cond ((null? lst)
odds)
((odd? (car lst))
(helper (cdr lst) (+ 1 odds)))
(else
(helper (cdr lst) odds))))
(helper lst 0))
(count-odds '(1 2 3))
; ==> 2
的内容。它只返回一个新值。你的大部分功能都是死代码,如果你真的想学习函数式编程,那么修改绑定和对象是不受限制的。
你需要做这样的事情:
odds
我们永远不会改变import collections
fileName = input("Enter file name:")
match = open(fileName)
table = []
for line in match:
contents = line.strip()
table.append(contents)
scores = collections.defaultdict(int)
for line in table:
teamA,teamB,scoreA,scoreB = line.split(':')
# even if scores does not have the team key, += will create it
scores[teamA] += int(scoreA)
scores[teamB] += int(scoreB)
,我们只是更新发送到下一次递归的内容。由于Scheme有尾调用消除,这就像在没有实际变异的情况下更新while循环中的变量一样。