2015-08-25 130 views
0

所以我很新的计划,在它的第一天编程。我试图做一个基本上需要两个论证的递归函数numlist, num numlist是一个数字列表,num是一个单一的数字。该函数获取列表,遍历每个元素并将其与num进行比较,如果该数字大于num,则将其替换为列表中的1,否则将其替换为0.我的递归函数没有返回任何东西,为什么?

例如:arguments(( 1,2,3,4,5,6,7,8,9,10),5)将列表变换为(0,0,0,0,0,1,1,1,1,1)

但由于某种原因,我的功能没有返回任何东西,它不会在我的屏幕上打印任何内容,为什么?

(define (greater-nums-in-list numlist num) 
    (cond 
    [(null? numlist)()] 
    [(> (car numlist) num) (append 1 (greater-nums-in-list((cdr numlist) num))] 
    [else (append 0 (greater-nums-in-list((cdr numlist) num)))] 
    ) 
) 

任何帮助将不胜感激,这只是个人学习代码,所以我不急于。

回答

1

的“一无所有”,它打印到屏幕是因为在递归底部的基本条件:

[(null? numlist)()] 

这意味着,当你做迭代列表,返回() - 那不是空白列表 - 应用“空白”,空列表是'()

有一对夫妇的括号臭虫,你不能追加10到列表 - 您需要首先将它们包装在一个列表:

(define (greater-nums-in-list numlist num) 
    (cond 
    [(null? numlist) '()] 
    [(> (car numlist) num) (append '(1) (greater-nums-in-list (cdr numlist) num))] 
    [else (append '(0) (greater-nums-in-list (cdr numlist) num))] 
    ) 
) 

使用

> (greater-nums-in-list '(1 2 3 4) 2) 
'(0 0 1 1) 
> (greater-nums-in-list '(1 2 3 4 5 6 7 8 9 10) 5) 
'(0 0 0 0 0 1 1 1 1 1) 
> 
+0

好它确实起作用,我唯一的疑问就是用其他语言它会返回正常,因为发生的事情是它会得到所有的0和1,然后在递归结束时追加它们,所以如果你有(1, 2,3)和1它会去0追加(2,3) - > 0追加1追加(3) - > 0追加1追加1追加() - >(0,1,1) 你知道吗?就像在F#中一样,这可以很好地工作,但无论如何。你的解决方案效果很好,我真的不明白为什么我的不是 –

+1

@ManPerson更新后的解决方案是修复你的代码,请检查它。我在我早些时候的评论中被误认为... – alfasin

+0

啊,现在我明白了,谢谢! –

相关问题