有人可以解释为什么以下不起作用?我正在经历SICP。本练习要求您创建一个计算结构对的函数。该程序用于三个结构,全部有三对。
import React, {Component} from 'react';
import MapView from 'react-native-maps';
import MyCustomCallout from './MyCustomCallout';
export default class Map extends Component{
constructor(props) {
super(props);
let marker = null;
}
render(){
return (
<MapView>
<MapView.Marker
draggable
onDragEnd={e => console.log(e.nativeEvent)}
coordinate={{
latitude: this.props.latitude,
longitude: this.props.longitude
}}
ref={ref => this.marker = ref }
image={finishImg}>
<MyCustomCallout type={'FINISH'} descriptionText={this.props.destinationName} />
</MapView.Marker>
</MapView>
);
}
}
正确的解决方案如下所示。怎么可能出错?我注意到遇到的处理方式略有不同,但我看不出会出现什么问题。
(define (count-pairs x)
(define (helper x encountered)
(if (or (not (pair? x)) (memq x encountered))
0
(begin
(set! encountered (cons x encountered))
(+ (helper (car x) encountered)
(helper (cdr x) encountered)
1))))
(helper x (list)))
输入(l1和y1)如下所示,但您无需尝试。
(define (count-pairs x)
(let ((encountered '()))
(define (helper x)
(if (or (not (pair? x)) (memq x encountered))
0
(begin
(set! encountered (cons x encountered))
(+ (helper (car x))
(helper (cdr x))
1))))
(helper x)))
答案 0 :(得分:1)
在你的回答中,你有encountered
作为助手的论据。这意味着helper
的每次使用都将拥有自己的encounter
版本。当您阅读此表格时:
(+ (helper (car x) encountered)
(helper (cdr x) encountered)
1)
第二次递归将不会添加第一次,因为您添加到帮助程序所具有的绑定,因此当代码恢复再次执行帮助程序时,它会传递它传递给第一次递归的相同版本。
通过使用let
绑定使得帮助程序始终更新相同的自由变量,可以避免存在多个绑定版本。