向左移动k次

时间:2018-04-26 17:46:12

标签: scheme racket

您好我正在尝试实施一个程序,将列表向左移动k次。 例如:

(shift-k-left ’(1 2 3) 2)
’(3 1 2)

我已经成功实现了一次在此处向左移动的代码:

(define shift-left
 (lambda (ls)
   (if (null? ls)
    '()
     (append (cdr ls)
          (cons (car ls)
                '())))))

我想在shift-k-left上使用shift left作为函数。

4 个答案:

答案 0 :(得分:1)

以下是使用srfi / 1中的循环列表的解决方案。

  (require srfi/1)

  (define (shift xs k)
      (define n (length xs))
      (take (drop (apply circular-list xs) k) n))

答案 1 :(得分:1)

使用shift-left转换k次:

  • 如果k为0:不执行任何操作
  • 如果k不是0:转换k-1次,然后shift-left结果。

即,

(define (shift-left-k ls k)
    (if (= k 0)
        ls
        (shift-left (shift-left-k ls (- k 1)))))

您可能需要进行调整以对负面k做一些合理的事情。

答案 2 :(得分:0)

我们的想法是在n cons car rp cdr r时倒数r {1}}然后基本案例将p附加到null?的反面。如果我们遇到r reverse我们p (define (shift-k-left l n) ; assume that n >= 0 (let loop ((n n) (p '()) (r l)) (if (= n 0) (append r (reverse p)) (if (null? r) (loop n '() (reverse p)) (loop (- n 1) (cons (car r) p) (cdr r)))))) 并继续执行轮换:

FallbackResource /index.php

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^([^\.]+)$ $1.php [NC,L]

答案 3 :(得分:-1)

以下是类似的内容:

package com.example.admin.ttabledemo;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private ListView listview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupIViews();
        iniToolbar();
    }

    private void setupIViews(){
        toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.ToolbarMain);
        listview = (ListView)findViewById(R.id.lvMain);

    }

    private void iniToolbar(){
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("TIMETABLE APP");
    }

现在你可以做一个抽象:

(define (addn value n)
  (let loop ((value value) (n n))
    (if (zero? n)
        value
        (loop (add1 value) (- n 1)))))

(addn 5 3)
; ==> 8

毋庸置疑(define (repeat proc) (lambda (v n) ...)) (define addn (repeat add1)) (addn 5 3) ; ==> 8 (define shift-k-left (repeat shift-left)) (shift-k-left ’(1 2 3) 2) ; ==> (3 1 2) 看起来很像repeat

注意:命名已关闭。您的实施更多"旋转"而不是" shift"。 add1实际上比您的实施更像shift-left