SICP ex 3.17 - Counting Pairs - 我不明白为什么我的答案出错了

时间:2017-03-06 13:59:13

标签: scheme sicp

有人可以解释为什么以下不起作用?我正在经历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))) 

1 个答案:

答案 0 :(得分:1)

在你的回答中,你有encountered作为助手的论据。这意味着helper的每次使用都将拥有自己的encounter版本。当您阅读此表格时:

(+ (helper (car x) encountered)
   (helper (cdr x) encountered)
   1)

第二次递归将不会添加第一次,因为您添加到帮助程序所具有的绑定,因此当代码恢复再次执行帮助程序时,它会传递它传递给第一次递归的相同版本。

通过使用let绑定使得帮助程序始终更新相同的自由变量,可以避免存在多个绑定版本。

相关问题